【问题标题】:How can you know the order of callback returns in this code?你怎么知道这段代码中回调返回的顺序?
【发布时间】:2014-01-28 07:58:25
【问题描述】:

以下是 Domenic Denicola 编写的关于 JavaScript 异步编程的流行幻灯片中的一些代码。

function parallel(actions, callback) {
  var results = [];
  function finished(result) {
    results.push(result);
    if (results.length === actions.length) {
      callback(results);
    }
  }

  actions.forEach(function (action) {
    action(finished);
  });
}

parallel([
  function (cb) {
    twitter.getTweetsFor("domenicdenicola", cb);
  },
  function (cb) {
    stackOverflow.getAnswersFor("Domenic", cb);
  },
  function (cb) {
    fourSquare.getCheckinsFor("Domenic", cb);
  }
], function (results) {
  console.log("tweets = ", results[0]);
  console.log("answers = ", results[1]);
  console.log("checkins = ", results[2]);
});

如果action数组中的函数是异步工作的,怎么知道results数组中值的顺序?

【问题讨论】:

  • 受欢迎并不意味着正确:-(
  • 这不是这段代码的唯一问题。然而,在他的辩护中,他似乎正在利用这个来提出更好的解决方案。
  • 我知道这是关于上面的代码,但是你可以使用像 Q.js 这样的 promise 库来确保序列:documentup.com/kriskowal/q/#tutorial/sequences

标签: javascript node.js asynchronous callback


【解决方案1】:

如何知道结果数组中值的顺序?

你已经明白了,人们不可能知道它们。应该是

function parallel(actions, callback) {
  var results = [],
      cnt = actions.length;
  actions.forEach(function(action, i) {
    action(function(result) {
      results[i] = result;
      if (!--cnt)
        callback(results);
    });
  });
  if (!cnt)
    callback(results);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2013-11-19
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多