2013-07-05 30 views
0

我有一个用例,我的http请求正在缓存服务器上的中间结果。 如果缓存不存在,请求通过请求另一个服务器来构建。暂停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); 
    } 
})(); 

我的查询: 可以请求没有投票暂停,然后继续第一个请求已完成缓存构建过程后,才?

回答

2

是的,它可以结合期货/承诺。你可以拿这个one。 外范围的界定VAR cachePromise,你可以使用像下面这样:

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

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

放入路径堆栈中的代码,使结果的路线之前,你是好去。

谢谢。