0

http リクエストが中間結果をサーバーにキャッシュしているユースケースがあります。キャッシュが存在しない場合、リクエストは別のサーバーをリクエストしてキャッシュを構築します。

これらのリクエストは、AJAX to 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);
    }
})();

私の質問: リクエストをポーリングせずに停止し、最初のリクエストがキャッシュ構築プロセスを完了した後にのみ続行できますか?

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 に答える