【问题标题】:Where is the async.waterfall callback definedasync.waterfall 回调在哪里定义
【发布时间】:2019-08-17 20:04:47
【问题描述】:

我正在使用 async 库,并且正在使用签名为 async.waterfall([function1,function2,function3],function(err,result){}) 的 async.waterfall 函数。现在我明白每个函数的结果都会传递给下一个函数,并且最终的回调函数会在中间出现错误或执行结束时执行。

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

下面是一段示例代码

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

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

【问题讨论】:

  • waterfall 的实现使用自己的回调函数调用您的函数。它需要这样做,以便收到异步成功/错误事件的通知,然后可以在自己的回调中采取行动来触发瀑布中的下一个函数,等等。
  • @trincot,我误读了这个问题,我认为 OP 要求定义瀑布,而不是瀑布回调:p
  • 对不起,我又弄错了,你实际看到的是onlyOnce函数返回的函数-github.com/caolan/async/blob/master/dist/async.js#L298
  • @trincot :我同意你的说法,但是当我们使用 npm -i async wwe 安装异步库时,我们应该得到这个定义。但不幸的是,我找不到那个定义。
  • @JaromandaX:感谢您的回答。正是我正在寻找的东西,它让我发疯......我正在使用 Visual Studio Code 在整个目录中搜索该函数......显然这在整个文件夹目录中搜索字符串方面做得不好.我现在已经找到了。谢谢

标签: javascript node.js async.js


【解决方案1】:

如果您查看此link 中的代码。定义的 next() 是被调用的回调。这是隐含的,您不必定义,因为即使是您传递给异步瀑布的任务也不是由您调用,而是由async.waterfall()

【讨论】:

    【解决方案2】:

    这里是异步瀑布的库代码。您将对它的工作原理有一个清晰的认识

    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([]);
    };
    

    有关更多信息,请安装异步库并查看节点模块文件夹。您将了解异步库的完整概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 2020-04-19
      • 1970-01-01
      • 2017-10-13
      • 2015-11-18
      • 2016-03-22
      • 2016-02-19
      相关资源
      最近更新 更多