0

我有一个用例,我的 http 请求正在服务器上缓存中间结果。如果缓存不存在,则请求通过请求另一台服务器来构建它。

这些请求使用 AJAX 连续(循环)触发到节点服务器,请求的数量可以在 50 到 500 的范围内。

问题: 由于请求是在循环中进行的并且缓存已经不存在,所以前几个请求都尝试构建缓存,有时后续请求会找到半构建的缓存,这会返回错误的结果。

我可以通过轮询来规避这个问题:

(function next(){
    if(!wait){
       fs.readFile(cacheFile, function(err){
           if(err) {
               wait = true;
               createCache(); // sets wait = false;
           } else {
               useCache();
           }
       });
    } else {
        setTimeout(next,waitTime);
    }
})();

我的问题: 是否可以在不进行轮询的情况下暂停请求,并仅在第一个请求完成缓存构建过程后继续?

4

1 回答 1

2

是的,可以与 Futures/Promise 结合使用。你可以拿这个。在范围之外定义 var cachePromise,您可以使用如下所示的内容:

if (!cachePromise) {
  cachePromise = require('future').create()
  buildCache(function() {
    cachePromise.fulfill();
  });
}

cachePromise.when(next); // this one triggers next route in middleware stack

将代码放在给出结果的路由之前的路由堆栈中,你就可以开始了。

谢谢。

于 2013-07-05T15:29:22.993 回答