【问题标题】:Join multiple callbacks/threads in javascript?在javascript中加入多个回调/线程?
【发布时间】:2013-01-15 06:35:25
【问题描述】:

我正在寻找一个 Thread.Join() 类型的东西。假设我在 javascript 中触发了 4 个事件。我想执行代码,但只有在完成所有 4 个回调之后。我怎么做?我能想到的唯一方法是通过 global var 检查是否有 4 个回调正在处理中,在这种情况下我会忽略或抛出异常。但除此之外,在每个回调中执行类似 globalVar++ 的操作,并在每个回调结束时调用 IsItDone() 来检查 globalVar 是否为 == 4。

但是.. 我有点不喜欢它,特别是因为我需要使用全局变量。

【问题讨论】:

  • 看看 pubsub.js,它对于将事件串在一起真的很有帮助。订阅和发布只是同步地按顺序遍历每个订阅的事件(如果您将其标记为同步)。 github.com/mroderick/PubSubJS
  • 将其添加为评论,因为它不是直接答案。

标签: javascript callback


【解决方案1】:

您可以串起一个队列并自己包装回调,但这有点麻烦。幸运的是,有大量的图书馆可以提供帮助。我不喜欢计数器方法,因为有时很难知道哪些回调还没有触发。

我是“延迟”风格的粉丝。比如这个库:https://github.com/heavylifters/deferred-js

或者对于完全不同的 API,请参阅 Step.js https://github.com/creationix/step

或查看此处了解封装此问题的其他微库:http://microjs.com/#defer


或者只是通过调用设置一些外部状态,然后在每个回调中调用共享的done 函数来自己做。

var complete = {
  first: false,
  second: false
};

doFirstAsync(function() {
  complete.first = true;
  allDone();
});

doSecondAsync(function() {
  complete.second = true;
  allDone();
});

var allDone = function() {
  if (complete.first && complete.second) {
    alert("done with all async!");
  }
};

上面的大多数库都基于类似的方法为您执行此操作。但只是抽象和概括。这种概括是事情可能变得棘手的地方,因为你到处都有回调函数数组。这是一种有趣的函数式编程,但在概念上可能会变得复杂。

如果您要重新执行此操作,请使用具有您喜欢的 API 的库。

【讨论】:

    【解决方案2】:

    如果您不介意将 jQuery 添加到您的网站,您可以使用其"deferred object" 功能。

    每个异步函数(包括 jQuery 的内置 AJAX 函数)都可以返回一个“承诺”,以便稍后返回。

    要实现您的要求,您可以致电:

    $.when(p1, p2, p3, p4).done(function() {
        // this will be called only when
        // all of p1 - p4 have been "resolved"
    });
    

    如果您希望使用包含这些承诺的数组 p,请改为调用 $.when

    $.when.apply($, p).done(function() {
        ...
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      相关资源
      最近更新 更多