我需要执行3件事,但必须按顺序完成。我也尝试过异步库,但仍然无法使用它。
1)获取数据库(我只是为了演示目的使用了一个数组)。
2)运行for循环
3)如果for循环中的“if”条件没有运行,那么执行我的第二个回调,我在for循环之下。
瀑布中的第二个功能我无法解决。如何确保首先执行for循环,然后根据条件选择要执行的回调?
var async = require('async');
async.waterfall([
function(callback) {
//some db query to fetch data --using fake data instead
var fakeData =[1,2,3,4,5,6,7,8,9];
callback(null, fakeData);
},
function(fakeData, callback) {
//this for loop has to run first!
for(var i = 0; i < fakeData.length; i++){
if(fakeData[i] == '5'){
return callback(null, '5');
}
}
//this block of code can only run after the for loop has finished
callback(null, 'none');
},
function(str, callback) {
if(str == '5'){
callback(null, 'exist');
} else {
callback(null, 'not');
}
}
], function (err, result) {
console.log(result);
});
答案 0 :(得分:1)
您收到的错误是callback
已经从异步库调用了,因为如果您找到了&#39; 5&#39;那么您正在调用callback
。在数组中,然后在遍历整个数组之后再次。
在if块中添加return语句会停止执行循环和函数,从而阻止第二次调用callback
。
for
循环(无论引擎如何)都是同步的,这意味着它们将迭代直到条件为假或完成某些操作来更改控制流(例如break
或{{1 }})。只有这样,控制流才会离开循环。使用return
将导致控制流离开包含函数并传递回调用者,中止函数中的任何其他循环或任何其他代码。