我刚刚发现了Async.js,我想知道数据库查询找到文档时async.waterfall
的行为是什么,以及如何通过不同的任务使用它。< / p>
我有这段代码:
var _arg1;
var _arg2;
async.waterfall([
function (callback) { // First "dummy" callback
callback(null, _arg1, _arg2);
},
function (arg1, arg2, callback) {
foo1(arg1, arg2, callback); // Built-in function, for example a database query returning a document
},
function (arg3, callback) {
foo2(arg3, callback); // arg3 is the document found by the query
},
function (callback) {
foo3(arg3, callback); // Here I would like to use `arg3` again
}],
function (err, result) {
if (err) {
console.log(err);
}
}
);
是否可以在我的第二个任务中使用arg1
,而不是每次都存储变量?
我想我可以做这样的事情,但我确信这不是最好的方法:
var _arg1;
var _arg2;
var _arg3;
async.waterfall([
function (callback) { // First "dummy" callback
callback(null, _arg1, _arg2);
},
function (arg1, arg2, callback) {
foo1(arg1, arg2, callback); // Built-in function, for example a database query returning a document
},
function (arg3, callback) {
_arg3 = arg3
foo2(arg3, callback); // arg3 is the document found by the query
},
function (callback) {
foo3(_arg3, callback); // Make use gain of `_arg3` ?
}],
function (err, result) {
if (err) {
console.log(err);
}
}
);
操纵任务中创建的不同变量的最佳方法是什么?
答案 0 :(得分:1)
每个瀑布函数都有自己的范围,因此无法共享变量。我只能想到这两个选项:
第二个是这样的:
var _arg1;
var _arg2;
async.waterfall([
function (callback) { // First "dummy" callback
callback(null, _arg1, _arg2);
},
function (arg1, arg2, callback) {
foo1(arg1, arg2, callback); // Built-in function, for example a database query returning a document
},
function (arg3, callback) {
foo2(arg3, function(err) {
if (err) {
callback(err);
}
callback(null, arg3);
});
},
function (arg3, callback) {
foo3(arg3, callback); // You can use `arg3` here again
}],
function (err) {
if (err) {
console.log(err);
}
}
);
根据我使用第一个或第二个的情况,在我的代码中我不能说哪一个更好。
在评论中已经指出了,但是如果你要创建新的东西,我也建议你使用Promise,通过Async.js创建的代码在复杂情况下会变得非常讨厌,特别是瀑布和类似的。