【问题标题】:execute a function against array items in sequence按顺序对数组项执行函数
【发布时间】:2015-11-09 21:23:20
【问题描述】:

假设我有一个数组和一个函数 A:

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

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

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

然而,如果A 中有一些异步操作,一切都会变得一团糟。所以问题是:

即使A中有异步动作,如何让它们有序执行?

我的意思是,我希望 A('b') 在 A('a') 完全完成后执行(包括其中的所有异步操作)。

我想一定有一些实用程序已经在做这样的事情了。有人能给我一些启示吗?

【问题讨论】:

  • 您是否尝试将函数 A 作为参数传递给 foreEach 而不是包装它?
  • 在你当前的形式中,这几乎是不可能的,因为函数A只接受一个参数,并且它没有能力在它完成它的工作时通知服务器(回调),所以服务器可以'不决定A('b')是否完整。
  • @fubbe 我猜它的运行方式相同。不保证 A 中的异步操作。
  • @fuyushimoya 哦,是的。它不必看起来像这样。回调是可以接受的。

标签: javascript arrays node.js asynchronous


【解决方案1】:

这是来自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 中的异步调用完成后调用回调参数。

【讨论】:

  • 好的,我试试。它在异步文档中提到了这个方法很奇怪,但是没有关于这个函数的细节。我以为是each 的别名。我会尝试过一段时间再回来。
  • 好的,这就是我要找的。感谢您的回答。现在我知道为什么我错过了这个。有一张纸条说:<name>Series - the same as <name> but runs only a single async operation at a time我只是错过了。
  • 他们不久前删除了详细描述,我认为它仍然存在时更容易理解。
【解决方案2】:

JavaScript Promises 允许您这样做。

这个例子相当复杂,但它展示了使用 Promises 的一些方面:

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());

【讨论】:

  • 如果 OP 尚未使用 async,我认为这是一个更好的解决方案。
  • 我实际上使用的是异步。但这绝对是一个可能的答案。无论如何,谢谢。
【解决方案3】:
var array = ['a', 'b', 'c'],i = 0;
var A = function(p){
    //some code
    $.ajax({
        success:function(){
            try{
                A(item[++i]);
            }catch{
                return;
            }
        }
    });
}

你是故意的吗?

【讨论】:

  • 它很接近,但我在服务器端使用 nodejs。无论如何,我已经得到了上面的答案。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多