我目前有一个看起来像这样的函数:

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/

10-16 07:58