我目前有一个看起来像这样的函数:
function update() {
buildUpdate(function(result) {
// send result to clients
});
}
这通常可以正常工作。但是,如果我做类似的事情:
// data state 1
update(); // this time, buildUpdate() won't take a long time
// do some work resulting in:
// data state 2
update(); // this time, buildUpdate() will take a long time
// and thus will finish after the third call
// do some work resulting in:
// data state 3
update(); // this time, buildUpdate() won't take a long time
如预期的那样,客户端将收到三个更新。但是,它们的顺序错误,因为
update()
的第三个调用确实比第二个调用更早完成。从客户的角度来看,它看起来像这样:接收根据数据状态1计算的更新
接收根据数据状态3计算的更新
接收根据数据状态2计算的更新(不应发送此更新)
是否有任何有助于避免这种情况的设计模式或功能?
注意:客户端是否没有收到所有更新都没有关系。重要的是接收到的最后一个必须与当前数据状态一致。
我的想法是在每次调用
update()
时生成一个随机ID。之后,我在回调中检查其ID是否与生成的最后一个ID相匹配。但是,ID的生成本身引入了新的异步计算,并且每次使用都会产生更多的代码。 最佳答案
最简单的方法可能是添加回调
function update(callback) {
buildUpdate(function(result) {
// send result to clients
if (typeof callback == 'function') callback();
});
}
并做
update(function() { // when the first one finishes
update(function() { // run the second one
update(function() { // and when the second is finished, the third
update(); // and so on....
});
});
});
如果添加async中间件,则可以使用更多高级方法来处理异步行为。
关于javascript - 检查回调是否最后被触发的方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21490120/