Обещания для обещаний, которые еще не созданы без использования отложенного [анти] шаблона
Проблема 1: только один запрос API разрешен в данный момент, поэтому реальные сетевые запросы ставятся в очередь, пока есть еще один, который еще не завершен. Приложение может вызывать уровень API в любое время, ожидая обещания взамен. Когда вызов API ставится в очередь, обещание для сетевого запроса будет создано в какой-то момент в будущем - что возвращать в приложение? Вот как это можно решить с помощью отложенного обещания «прокси»:
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();
}
}
Проблема 2: некоторые вызовы API обрабатываются таким образом, что отправляемые данные накапливаются с течением времени, а затем отправляются в пакете по истечении времени ожидания. Приложение, вызывающее API, ожидает обещание взамен.
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?