我刚刚发现 Async.js,我想知道当数据库查询找到文档时 async.waterfall
的行为是什么,以及如何使用它通过不同的任务。
我有这段代码:
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);
}
}
);
操作任务中创建的不同变量的最佳方法是什么?
最佳答案
每个 waterfall 函数都有自己的作用域,因此不可能共享变量。我只能想到这两个选择:
- 在 waterfall 之外声明变量(您所做的)
- 使用回调将变量传递给下一个函数
第二个是这样的:
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);
}
}
);
我无法说哪个更好,在我的代码中取决于我使用第一个或第二个的情况。
评论中已指出,但如果您要创建新内容,我还建议您使用 Promises,通过 Async.js 创建的代码在复杂情况下可能会变得非常糟糕,尤其是 waterfall 和类似情况。
关于javascript - Async.js:在 waterfall 任务中创建的变量是否可以在另一个任务中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41125017/