在所有迭代完成之前调用了node.js async.each()回调

时间:2015-07-14 18:12:38

标签: javascript node.js asynchronous

有人可以解释我如何在所有迭代完成后才能进行回调吗?我使用了async.each函数:

async.each(products, function (product, callback) {
    fs.appendFile('ParseLog.txt', "PRODUCT name: " + product.name, function (err) {
        console.log("iterate");
        callback();
    });
}, function (err) {
    console.log("ALL FINISH");
});

所以我的输入如下:

ALL FINISH 
iterate 
iterate
iterate
...

但我希望"所有结束"消息将在所有迭代后打印。 编辑1: 对不起,但似乎麻烦在每个循环开始的if(i > 10) return callback({ data: 'hi'}); // stop。 我只是想在11次迭代后退出,但我最初为什么要回调它会很奇怪。?

 async.each(products, function (product, callback) {
    var i = products.indexOf(product);
    if(i > 10)  return callback({ data: 'hi'}); // stop
 fs.appendFile('ParseLog.txt', "PRODUCT name: " + product.name, function (err) {
            console.log("iterate");
            callback();
        });
..

1 个答案:

答案 0 :(得分:4)

您应该在将传递到async.each之前限制要处理的产品数量:

async.each(products.slice(0, 11), function (product, callback) {
  fs.appendFile('ParseLog.txt', "PRODUCT name: " + product.name, function (err) {
    console.log("iterate");
    callback(err); // make sure to pass `err`!
  });
}, function(err) {
  if (err) console.log('ERROR', err);
  console.log("ALL FINISH");
});

此外,当您调用延续回调时,第一个参数是"保留"发出错误信号。在您的示例中,您正在使用它来传递一个对象({ data: 'hi' }),这会使async认为发生了错误(除非您的意图是?)。正确的习惯是:

callback(null, { data: 'hi' })