我正在寻找一个Thread.Join()类型的东西。假设我在javascript中触发了4个事件。我想执行代码,但只有在完成所有4个回调之后。我怎么做?我能想到的唯一方法是检查是否有4个回调通过全局变量进行处理,在这种情况下我忽略或抛出异常。但是否则在每个回调中执行类似globalVar ++的操作,并在每个回调结束时调用IsItDone(),以检查globalVar是否为== 4.
但是......我有点不喜欢它,特别是因为我需要使用全局变量。
答案 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() {
...
});