在node.js中,如何将bluebird-promise与for循环一起使用



我正在使用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调用,并增加了操作的复杂性。

最新更新