如何在Async库的“Each”函数中定义回调?

时间:2016-02-22 01:29:36

标签: javascript asynchronous callback

在Caolan的Async库中,文档说each函数:

  

将函数iteratee并行应用于arr中的每个项目。使用列表中的项目调用iteratee,并在完成时调用它。

这个例子给出了:

async.each(arr, iteraree, function(err){
    //Do stuff
});

我的问题是如何定义“回调”,在这种情况下是iteraree?如何在完成后声明要调用哪个回调函数?

如果你能够将函数定义为参数,我可以看到它有效,但你不能(即):

async.each(openFiles, function (item, function () {console.log("done")}), function(err){
  //Do stuff
});

但是我如何定义该回调不是内联的?

如果我做的话

var iteraree = function (item, callback) {};

并传入iteraree我仍然看不出我能在哪里定义callback的行为。

4 个答案:

答案 0 :(得分:2)

该iteratee函数没有您认为的签名。它看起来像这样:

async.each(openFiles, function (item, cb){
       console.log(item);
       cb();   
    }, function(err){
      //Do stuff
 });

它接收来自asynchronous.each()的每个项目和一个回调函数,当你完成你正在做的事情时必须调用它。您没有提供回调。

因此,如果您使用的是命名函数,那就是:

 function foo (item, cb){
       console.log(item);
       cb();   
    }

async.each(openFiles, foo, function(err){
      //Do stuff
 });

答案 1 :(得分:2)

  

我仍然没有看到我能够定义callback的行为。

你没有。 callback只是一个参数。 async.each调用iteratee并传递callback的值。完成后,致电 callback是您的责任。这使async.each知道它可以继续下一次迭代。

function (item, function () {console.log("done")})无效的JavaScript btw。您不能使用函数定义代替参数。

答案 2 :(得分:0)

以下是其文档中添加了评论的示例的修改版本

//I personally prefer to define it as anonymous function, because it is easier to see that this function will be the one iterated
async.each(openFiles, function(file, callback) {

    callback(); //this is just like calling the next item to iterate

}, then);

//this gets called after all the items are iterated or an error is raised
function then(err){
    // if any of the file processing produced an error, err would equal that error
    if( err ) {
      // One of the iterations produced an error.
      // All processing will now stop.
      console.log('A file failed to process');
    } else {
      console.log('All files have been processed successfully');
    }
}

答案 3 :(得分:0)

如下面的代码所示,它是一个内置函数,使我们能够根据自定义限制抛出错误。它的所有细节都由异步模块控制,我们不应该覆盖它。它是一种这样的功能:你需要使用它,你不需要定义它。

const async = require('async');

const array = [1, 2, 3, 4, 5];

const handleError = (err) => {
    if (err) {
        console.log(err);
        return undefined;
    }
}

async.each(array, (item, cb) => {
    if (item > 2) {
        cb('item is too big');
    }
    else {
        console.log(item);
    }
}, handleError);

控制台日志:

1
2
item is too big