搜索“NPM使用单个承诺整合服务器请求”或“...累积服务器请求...”没有任何明显变化。我将使用评论中提到的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);
关于“保证”部分 - 如果合并承诺由于通信故障拒绝,承诺的所有收件人可以赶上拒绝。但是如果一个特定的密钥是未知的,有效密钥的接收者应该继续。所以我的建议是从个人无效密钥的服务器返回一个无效值。否则,算法看起来很好(28行代码模拟;-)) – traktor53