问题 1:在给定时间只允许一个 API 请求,因此真正的网络请求在排队,而有一个尚未完成。应用程序可以随时调用 API 级别并期望得到Promise的回报。当 API 调用排队时,网络请求的Promise将在未来的某个时刻创建 - 返回给应用程序的内容是什么?这就是如何通过延迟的“代理”Promise来解决它:
var queue = [];
function callAPI (params) {
if (API_available) {
API_available = false;
return doRealNetRequest(params).then(function(data){
API_available = true;
continueRequests();
return data;
});
} else {
var deferred = Promise.defer();
function makeRequest() {
API_available = false;
doRealNetRequest(params).then(function(data) {
deferred.resolve(data);
API_available = true;
continueRequests();
}, deferred.reject);
}
queue.push(makeRequest);
return deferred.promise;
}
}
function continueRequests() {
if (queue.length) {
var makeRequest = queue.shift();
makeRequest();
}
}
问题二:部分API调用debounce,使得待发送的数据随着时间的推移积累起来,到了超时就批量发送。调用 API 的应用程序期望得到Promise作为回报。
var queue = null;
var timeout = 0;
function callAPI2(data) {
if (!queue) {
queue = {data: [], deferred: Promise.defer()};
}
queue.data.push(data);
clearTimeout(timeout);
timeout = setTimeout(processData, 10);
return queue.deferred.promise;
}
function processData() {
callAPI(queue.data).then(queue.deferred.resolve, queue.deferred.reject);
queue = null;
}
由于延迟被认为是一种反模式,(另请参阅何时有人需要创建延迟?),问题是 - 是否可以new Promise(function (resolve, reject) {outerVar = [resolve, reject]});使用标准的 Promise API 在没有延迟(或类似的 hacks )的情况下实现相同的事情?