我正在寻找一个 Thread.Join() 类型的东西。假设我在 javascript 中触发了 4 个事件。我想执行代码,但只有在完成所有 4 个回调之后。我怎么做?我能想到的唯一方法是通过 global var 检查是否有 4 个回调正在处理中,在这种情况下我会忽略或抛出异常。但否则在每个回调中执行类似 globalVar++ 的操作,并在每个回调结束时调用 IsItDone() 来检查 globalVar 是否为 == 4。
但是..我有点不喜欢它,特别是因为我需要使用全局变量。
我正在寻找一个 Thread.Join() 类型的东西。假设我在 javascript 中触发了 4 个事件。我想执行代码,但只有在完成所有 4 个回调之后。我怎么做?我能想到的唯一方法是通过 global var 检查是否有 4 个回调正在处理中,在这种情况下我会忽略或抛出异常。但否则在每个回调中执行类似 globalVar++ 的操作,并在每个回调结束时调用 IsItDone() 来检查 globalVar 是否为 == 4。
但是..我有点不喜欢它,特别是因为我需要使用全局变量。
您可以自己串起一个队列并包装回调,但这有点毛茸茸。幸运的是,有大量的图书馆可以提供帮助。我不喜欢 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 的库。
如果您不介意将 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() {
...
});