我正在使用异步库,并且正在使用签名为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);
}
现在我不明白从哪里得到这个定义。我也为此搜索了异步库,但找不到。 谁能解释这个。
答案 0 :(得分:0)
如果您浏览此link中的代码。定义的next()是被调用的回调。它是隐式的,您无需定义,这是因为即使您传递给异步瀑布的任务也不会被您调用,而是由async.waterfall()
答案 1 :(得分:0)
这是异步瀑布的库代码。您将对它的工作原理有个清晰的认识
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([]);
};
有关更多信息,请安装异步库并查看节点模块文件夹。您将获得异步库的完整概念。