async.parallel中的回调是如何工作的(它来自哪里?)

how does the callback in async.parallel work (where does it come from?)

本文关键字:parallel 工作 回调 何工作 async      更新时间:2023-09-26

我在文档中找到了这个例子。我理解主回调(函数(错误,结果)…)有效,但传递到一个和两个函数中的"callback"参数是什么?这些是从哪里来的,它们是做什么的?

async.parallel({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }
},
function(err, results) {
    // results is now equals to: {one: 1, two: 2}
});

callback参数由异步基础结构传递给函数。它指向async内部的一个函数(尽管这不是您需要知道的)。异步基础结构将它传递给您,并要求您在正确的时间调用它。

这就是你如何与异步库通信,告诉它你的异步函数已经完成了它的工作,以及它是成功完成还是有错误。当你的函数完成它的工作时,你调用该函数,它会通知异步库进程的这一步现在已经完成(错误或成功)。


仅供参考,如果您熟悉node.js中的Express中间件,它与传递给中间件的next参数非常相似。当您的中间件被调用时,传递给它的参数之一是next回调。中间件完成它的工作(可以是异步的),然后当它完成时,它通过调用传递给它的next()回调来告诉Express基础设施它已经完成

这里有一个与Express有点相似的例子:

app.use(function (req, res, next) {
  doSomethingAsync(function() {
       next();
  })
});

它不是来自任何地方,它只是库的工作方式,回调用于将数据传递给下一个函数。

这是这里的功能:

function _parallel(eachfn, tasks, callback) {
    callback = callback || noop;
    var results = isArrayLike(tasks) ? [] : {};
    eachfn(tasks, function (task, key, callback) {
        task(rest(function (err, args) {
            if (args.length <= 1) {
                args = args[0];
            }
            results[key] = args;
            callback(err);
        }));
    }, function (err) {
        callback(err, results);
    });
}

https://github.com/caolan/async/blob/master/dist/async.js#L3471