Async.js: 在瀑布任务中创建的变量在另一个任务中是否可用?
Async.js: Is a variable created in a waterfall task available in another task?
我刚刚发现 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);
}
}
);
操作任务中创建的不同变量的最佳方法是什么?
每个瀑布函数都有自己的作用域,因此无法共享变量。我只能想到这两个选项:
- 在瀑布外声明变量(你所做的那个)
- 使用回调将变量传递给下一个函数
第二个是这样的:
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 创建的代码在复杂情况下会变得非常糟糕,尤其是瀑布流和类似的情况一个。
我刚刚发现 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);
}
}
);
操作任务中创建的不同变量的最佳方法是什么?
每个瀑布函数都有自己的作用域,因此无法共享变量。我只能想到这两个选项:
- 在瀑布外声明变量(你所做的那个)
- 使用回调将变量传递给下一个函数
第二个是这样的:
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 创建的代码在复杂情况下会变得非常糟糕,尤其是瀑布流和类似的情况一个。