2013-07-05 73 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 

放入路徑堆棧中的代碼,使結果的路線之前,你是好去。

謝謝。