我正在使用bluebird来使我的js代码同步。当在for循环中时,我不知道同步它的语法
for (i=0; i < rows.length; ++i) {
var writeBuffer = new Buffer(JSON.stringify(rows[i]))
fs.appendFileAsync(filename, i + '');
}
fs.appendFileAsync(filename, 'end');
我不知道如何确保每个appendFileAsync都按顺序进行,以及确保在for循环之后附加"end"。有人能帮我吗?
试试这个:
rows.reduce(function(previous, item){
return previous.then(function(){
return fs.appendFileAsync(filename, item + 'n');
});
}, Promise.resolve())
.then(function(){
fs.appendFileAsync(filename, 'end');
});
参考:https://stackoverflow.com/a/17764496/1807881
其想法是为数组中的每个项连锁promise,以便它们按顺序执行。使用reduce
,您可以获取上一个promise,并使用then
将其与数组中的下一个项目链接。
您可以使用array reduce,但在这种情况下,您可能不想在进行任何fs调用之前对数据进行一致化。
减少阵列:
var Promise = require('bluebird');
var fs = Promise.promisifyAll(require('fs'));
rows.map(function(row) {
return new Buffer(JSON.stringify(row));
}).concat(['end'])
.reduce(function(a, b) {
return a.then(function() {
return fs.appendFileAsync(filename, b);
})
}, Promise.resolve(''))
.then(function(res) {
// all done here
})
.catch(function(err) {
throw err;
});
在我看来,以下是不错的
var data = rows.map(function(row) {
return JSON.stringify(row);
})
.concat(['end'])
.join('');
fs.appendFileAsync(filename, data).then(function(res) {
});
一旦你创造了一个承诺,它就开始了。减少数组是确保顺序执行的好方法。你本质上是在构建一系列承诺。在你的情况下,这是可行的,但这是最好的选择吗?这将是对每一行的fs调用,并增加了操作的复杂性。