async.waterfall回调定义在哪里

问题描述 投票:1回答:2

我正在使用异步库并使用async.waterfall函数,其签名为async.waterfall([function1,function2,function3],function(err,result){})。现在我明白了每个函数的结果都被传递给下一个函数,并且在执行结束时或执行结束时发生了一些错误的情况下执行了最终的回调函数。

我不明白的是,传递的函数数组中的每个函数都将回调作为参数,并且在每个函数中使用该函数的结果执行回调。但我不明白该回调函数的定义。

下面是一段示例代码

 async.waterfall([
 function getUserAvatar(callback) {
    console.log("Callback function is " + callback)//print the 
     callback definition function 
    github.search.users({ q: 'airbnb' }, function(err, res) {
        if (err) {
            callback(err, null);
            return;
        }

        var avatarUrl = res.items[0].avatar_url;
        callback(null, avatarUrl);
    });
  },
  function wrapAvatarInHtml(avatarUrl, callback) {
    var avatarWithHtml = '<img src="' + avatarUrl + '"/>';
    callback(null, avatarWithHtml);
}
], function(err, result) {
 if (err) {
    console.error(err);
    return;
 }
console.log(result);
})

当我执行上面的代码时,我执行console.log("Callback function is " + callback)的行打印下面的定义。

function () {
        if (fn === null) throw new Error("Callback was already called.");
        var callFn = fn;
        fn = null;
        callFn.apply(this, arguments);
    }

现在我不明白这个定义在哪里。我也搜索了异步库,但我找不到它。谁能解释一下呢。

javascript node.js async.js
2个回答
0
投票

如果你通过这个link中的代码。定义的next()是被调用的回调。它是隐含的,你不必定义,因为即使你传递给异步瀑布的任务也没有被你调用,而是由async.waterfall()


0
投票

这是async瀑布的库代码。您将了解它的工作原理

exports.default = function (tasks, callback) {
    callback = (0, _once2.default)(callback || _noop2.default);
    if (!(0, _isArray2.default)(tasks)) return callback(new Error('First argument to waterfall must be an array of functions'));
    if (!tasks.length) return callback();
    var taskIndex = 0;

    function nextTask(args) {
        var task = (0, _wrapAsync2.default)(tasks[taskIndex++]);
        args.push((0, _onlyOnce2.default)(next));
        task.apply(null, args);
    }

    function next(err /*, ...args*/) {
        if (err || taskIndex === tasks.length) {
            return callback.apply(null, arguments);
        }
        nextTask((0, _slice2.default)(arguments, 1));
    }

    nextTask([]);
};

有关更多信息,请安装异步库并查看node modules文件夹。您将完全了解异步库。

© www.soinside.com 2019 - 2024. All rights reserved.