在循环中使用 async.series 或瀑布
use async.series or waterfall in a loop
我刚开始学习使用异步,我想做这样的事情:
var listOfArguments = [];
async.waterfall([
getTheListOfArguments,
function(callback) {
if (listOfArguments.lengh > 0) {
doSomething(listOfArguments.shift());
} else {
callback(null, listOfArguments);
}
}
], function(err, res) {
})
事实上,我希望 getListOfArguments 读取一些列表并将其保存在全局范围内,然后我想遍历 doSomething 函数以获取数组的每个元素作为输入并移动到下一个元素 仅当第一个完成(因此使用异步!),但这似乎不起作用。
有人能帮帮我吗?
虽然我不太确定您想要实现什么,但我相信您需要的代码可能看起来更像这样
var listOfArguments = [];
getTheListOfArguments(function(){
// listOfArguments now contains some items, let's process it
if(listOfArguments.length) doSomething();
});
function doSomething() {
var item = listOfArguments.pop();
// ... do your thing here
// if we still have some items in the listOfArguments array doSomething again
if(listOfArguments.length) return doSomething();
// we are done, do something here
console.log('Done');
}
尝试这样的事情。
var listOfArguments = [];
var listOfTasks = [];
getTheListOfArguments(function(){
listOfArguments.forEach(function(arg){
listOfTasks.push(doSomething.bind(null, arg))
});
});
async.series(listOfTasks, function(err, res) {
})
这里最好的选择是 async.whilst 你的情况。
第一个参数是测试函数。只要第一个参数 return 为真,第二个参数就会 运行。第三个参数会在第一个参数return之后运行为false或者出错。
doSomething 函数每次迭代后都会检查第一个参数。
async.whilst(
function() { return list_of_arguments.length > 0; },
function(callback) {
doSomething(list_of_arguments,(err, list_of_arguments)=>{
if(err){
callback(err,null)
}
list_of_arguments.shift();
callback(null,list_of_arguments);
});
},
function (err, list_of_arguments) {
if(err){
console.log(error)
}
else{
// list of arguments is empty here
console.log(list_of_arguments.length) //logs 0
}
}
);
我刚开始学习使用异步,我想做这样的事情:
var listOfArguments = [];
async.waterfall([
getTheListOfArguments,
function(callback) {
if (listOfArguments.lengh > 0) {
doSomething(listOfArguments.shift());
} else {
callback(null, listOfArguments);
}
}
], function(err, res) {
})
事实上,我希望 getListOfArguments 读取一些列表并将其保存在全局范围内,然后我想遍历 doSomething 函数以获取数组的每个元素作为输入并移动到下一个元素 仅当第一个完成(因此使用异步!),但这似乎不起作用。
有人能帮帮我吗?
虽然我不太确定您想要实现什么,但我相信您需要的代码可能看起来更像这样
var listOfArguments = [];
getTheListOfArguments(function(){
// listOfArguments now contains some items, let's process it
if(listOfArguments.length) doSomething();
});
function doSomething() {
var item = listOfArguments.pop();
// ... do your thing here
// if we still have some items in the listOfArguments array doSomething again
if(listOfArguments.length) return doSomething();
// we are done, do something here
console.log('Done');
}
尝试这样的事情。
var listOfArguments = [];
var listOfTasks = [];
getTheListOfArguments(function(){
listOfArguments.forEach(function(arg){
listOfTasks.push(doSomething.bind(null, arg))
});
});
async.series(listOfTasks, function(err, res) {
})
这里最好的选择是 async.whilst 你的情况。
第一个参数是测试函数。只要第一个参数 return 为真,第二个参数就会 运行。第三个参数会在第一个参数return之后运行为false或者出错。
doSomething 函数每次迭代后都会检查第一个参数。
async.whilst(
function() { return list_of_arguments.length > 0; },
function(callback) {
doSomething(list_of_arguments,(err, list_of_arguments)=>{
if(err){
callback(err,null)
}
list_of_arguments.shift();
callback(null,list_of_arguments);
});
},
function (err, list_of_arguments) {
if(err){
console.log(error)
}
else{
// list of arguments is empty here
console.log(list_of_arguments.length) //logs 0
}
}
);