【问题标题】:how does the callback in async.parallel work (where does it come from?)async.parallel 中的回调如何工作(它来自哪里?)
【发布时间】:2016-05-03 23:53:22
【问题描述】:

我在docs 中找到了这个示例。我了解主回调(函数(err,results)...)是如何工作的,但是传递给一个和两个函数的“回调”参数是什么?那些来自哪里,他们做什么?

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}
});

【问题讨论】:

    标签: javascript asynchronous callback asynccallback


    【解决方案1】:

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

    这是您与异步库通信的方式,告诉它​​您的异步函数已完成工作,以及它是成功完成还是出错。当您的函数完成它的工作时,您调用该函数并通知异步库该过程的这一步现已完成(错误或成功)。


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

    这里有一个来自 Express 的类似示例:

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

    【讨论】:

    • ok 回调向主回调表明工作已完成。但是传递那个回调参数有什么意义呢? like (null, and 1? null 有什么意义?和 1 只是成功响应?
    • @jlei - 回调的第一个参数告诉 async 是否有错误。你通过null 表示没有错误。如果您为第一个参数传递任何真实值(通常是错误对象),则表示错误条件,异步库将中止其其余处理并将该错误传递给完成回调。这是 node 中常见的异步调用约定。
    【解决方案2】:

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

    这是这里的功能:

    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

    【讨论】:

    • 嗯,它确实来自某个地方。它来自异步库内部。
    猜你喜欢
    • 2015-04-29
    • 2018-07-27
    • 2016-04-10
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多