在javascript中加入多个回调/线程?

时间:2013-01-13 00:41:56

标签: javascript callback

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

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

2 个答案:

答案 0 :(得分:9)

你可以将一个队列串起来并自己包装回调,但它有点毛茸茸。幸运的是,有很多图书馆可以提供帮助。我不是反制方法的粉丝,因为有时很难知道哪些回调还没有被解雇。

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

答案 1 :(得分:4)

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

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

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

$.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() {
    ...
});
相关问题