nodeJS中的同步执行涉及使用异步模块的for循环?

时间:2016-07-20 22:34:56

标签: node.js asynchronous

我需要执行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);
});

1 个答案:

答案 0 :(得分:1)

您收到的错误是callback已经从异步库调用了,因为如果您找到了&#39; 5&#39;那么您正在调用callback。在数组中,然后在遍历整个数组之后再次。

在if块中添加return语句会停止执行循环和函数,从而阻止第二次调用callback

javascript中的

for循环(无论引擎如何)都是同步的,这意味着它们将迭代直到条件为假或完成某些操作来更改控制流(例如break或{{1 }})。只有这样,控制流才会离开循环。使用return将导致控制流离开包含函数并传递回调用者,中止函数中的任何其他循环或任何其他代码。