2016-10-11 6 views
0

鍵をとり、オブジェクトの約束を返す関数を繰り返し呼び出すことによって、高価な複数のサーバー呼び出しを最適化したいと考えています。解決されると、オブジェクトには必要なキー+値が含まれていることが保証され、関連のない他のキーも含まれる可能性があります。機能はなります:最初の呼び出しでJSで複数のデバウンスを組み合わせる

  • 、呼び出しごとに約束
  • を作成するには、すべてのコールが静かな時間の100msの
  • ときまで、同じ約束を返すサーバー
  • に送信するキーを蓄積します100msの間に呼び出しが行われていない場合は、サーバーにまだ応答していない場合でも、新しい呼び出しが行われた場合には、これまでに蓄積されたすべてのキーを処理するようにサーバーに呼び出します(
  • )。保留中の鍵のセットを持つ新しい約束
  • サーバーコールが返されたときに保留中の約束を解決する

これを助けるNPMライブラリはありますか、またはゼロから書き込むべきですか?

+0

...等保証されません - 連結約束は通信障害のため拒否した場合、約束のすべての受信者が拒絶反応をキャッチすることができます。しかし、特定のキーが不明な場合、有効なキーの受信者は続行する必要があります。だから私の提案は無効な個々のキーのサーバーから無効な値を返すことです。さもなければ、アルゴリズムはうまくいくように見える(28行のコードをモックアップする;-)) – traktor53

答えて

0

"NPMが単一の約束を使用してサーバー要求を集約する"または "... accumulate server requests ..."を検索しても、何も明らかになりませんでした。コメントに記載されているES6の約束を使ってモックアップコードを共有して、おそらく他の提案がない場合の解決策の基礎を形成するでしょう。以下のようになり、「保証」の部分については

/******* application code ********/ 

function requestKeys(keyArray) { 
    // promise an oject for values of keys in keyArray: 
    // use asynchronous code to get values for keys in keyArray, 
    // return a promise for the parsed result object. 
    // ... 
} 

const latency = 100; // maximum latency between getting a key and making a request 

/******** generic code *********/ 

var getKey = ((requestKeys, latency) => { 
    // return a function to return a promise of a key value object 
    var promise = null; 
    var resolve = null; 
    var reject = null; 
    var pendingKeys = null; 

    var defer =() => { 
     promise = new Promise((r,j) => {resolve = r; reject = j}); 
     pendingKeys = []; 
    }; 

    var running = false; 
    var timesUp =() => { 
     resolve(requestKeys(pendingKeys)); 
     running = false; 
    } 
    var addKey = (key) => { 
     if(! running) { 
      defer(); 
      setTimeout(timesUp, latency); 
      running = true; 
     } 
     pendingKeys.push(key); 
     return promise; 
    } 
    return addKey; 
})(requestKeys, latency); 


/******* test code *******/ 

// redefine requestKeys to promise an object with key strings as key values, 
// resolve the return promise synchronously for testing: 

function requestKeys(keyArray) { 
    var keyObj = keyArray.reduce(((obj, v) => ((obj[v] = v), obj)), {}); 
    return new Promise((resolve, reject) => resolve(keyObj)); 
} 

var log = obj => console.log(JSON.stringify(obj)); 

// get two keys quickly 
getKey("holas").then(log); 
getKey("buono").then(log); 

// wait and get another 
setTimeout(function(){getKey('later').then(log)}, 500); 
関連する問題