按顺序执行对数组项的函数

时间:2015-08-17 09:33:09

标签: javascript arrays node.js asynchronous

说我有一个数组和一个函数A:

var array = ['a', 'b', 'c'];
function A(p) { ... };

现在我想将array的每个项目传递给函数A,并希望它们按顺序执行。通常不会有任何问题。我能做到:

array.forEach(function(item) {
  A(item);
}

但是,如果A中有一些异步操作,一切都会搞砸。所以问题是:

即使A中有异步操作,我怎样才能让它们有序执行?

我的意思是,我希望A(&#39; b&#39;)在A(&#39; a&#39;)完全结束后执行(包括其中的所有异步操作)。< / p>

我想一定有一些公用事业公司已经在做这些事了。有人能给我一些启示吗?

3 个答案:

答案 0 :(得分:7)

这是来自async.js

的“eachSeries”的完美用例

你可以这样使用它

async.eachSeries(array, A, function(err) {
    // this function gets called at the end 
    // after your array has been looped
});

你必须使用第二个参数修改你的A函数 - 回调。

function A(p, callback) {
    // ...
    return callback();
}

一旦A中的异步调用完成,它就会调用callback参数。

答案 1 :(得分:3)

JavaScript Promises允许您这样做。

这个例子非常复杂,但它显示了使用Promises的一些方面:

&#13;
&#13;
var arr = ['a', 'b', 'c'];

function processAsync(val) {
  return new Promise(function(res, rej) {
    console.log("Starting:", val);
    setTimeout(function () {
      console.log("Done:", val);
      res();
    }, 1000);
  });
}

arr.reduce(function(promise, i) {
  return promise.then(processAsync.bind(null, i));
}, Promise.resolve());
&#13;
&#13;
&#13;

答案 2 :(得分:0)

var array = ['a', 'b', 'c'],i = 0;
var A = function(p){
    //some code
    $.ajax({
        success:function(){
            try{
                A(item[++i]);
            }catch{
                return;
            }
        }
    });
}

你的意思是?