暂停http请求,直到缓存准备就绪而不进行轮询



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

这些请求是使用AJAX向Node Server连续(循环)触发的,请求的数量可以在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);
    }
})();

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

是的,可以与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

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

谢谢。

相关内容

最新更新