9

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

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

4

2 回答 2

9

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

我是“延迟”风格的粉丝。比如这个库: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 的库。

于 2013-01-13T00:57:14.200 回答
4

如果您不介意将 jQuery 添加到您的站点,您可以使用它的“延迟对象”功能。

每个异步函数(包括 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() {
    ...
});
于 2013-01-13T01:10:33.547 回答