当函数完成时,Nodejs回调下一个循环

时间:2016-02-09 09:57:25

标签: javascript node.js loops foreach

假设我们有一个脚本,它将为数组中的每一行执行某个任务。

    if (left < index) {
        quickSort(arr, left, index);
    }

    if (index + 1 < right) {
        quickSort(arr, index + 1, right);
    }

问题:

  • 如何在完成任务后才进入下一个循环?
  • 我的功能是否被视为异步?

4 个答案:

答案 0 :(得分:2)

您可以执行以下操作来迭代您的数组:

var myarray = [1,2,3,4,5];
next(myarray, 0);

function next(array, idx) {
    if (idx !== array.length) {
        // do something
        console.log(array[idx]);

        // run other functions with callback
        another_fct(array[idx], function() {
            next(array, idx + 1); // then the next loop
        });

        // or run directly the next loop
        next(array, idx + 1);
     } else {
        // the entire array has been proceed
        console.log('an array of '+array.length+' number of elements have been proceed');
    }
}

function another_fct(array_element, callback) {
    // do something with array_element
    console.log('value : '+array_element);
    callback(); // run the next loop after processing
}

此方法将同步执行数组元素。

答案 1 :(得分:1)

试试这个:

function execute(err, array) {
    loop(array, function(err, object, next) {
         console.log(object);
         next(); // this will call recur inside loop function
    }, function() {
         console.log('All done');
    });
}

function loop(array, callback, finish) {
    var copy = array.slice();
    (function recur() {
        var item = copy.shift();
        if (item) {
            callback(null, item, recur);
        } else {
            if (typeof finish == 'function') { 
                finish();
            }
        }
    })();
}

不,您的函数不是异步的,而是使用setTimeout异步调用它。

答案 2 :(得分:0)

async为此提供了async.series和其他帮助程序。

答案 3 :(得分:0)

如果您重构代码并删除任何冗余的匿名函数,您可以更好地包围它。例如,将匿名函数作为参数传递给另一个函数尚未使函数异步。您在"Does taking a callback make a function asynchronous?"中阅读了更深入的解释。

从重构版本

setTimeout(function() {
    [1, 2, 3, 4, 5].forEach(function(object) {
        console.log(object)
        //do a certain task when it's...
    });
}, 6000);

可以看出,为数组调用了forEachforEach方法每个数组元素执行一次提供的函数并同步执行。

所以,回答你的问题:

  1. 是的,只有在完成上一个项目之后才调用下一个项目(但如果做了异步,请参见下文)
  2. 这不被视为异步,因为它不执行任何异步操作(不考虑外部setTimeout
  3. 但是,如果您选择在forEach函数中启动异步操作,则情况会发生很大变化。结果是所有操作都在同一时间进行。这可能是资源方面的危险操作。有像async这样的库可以优雅地处理这个用例。

    (顺便说一句,好好利用Node.js errbacks,其中第一个函数参数保留用于传递潜在错误。)