【发布时间】: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