Обещания для обещаний, которые еще не созданы без использования отложенного [анти] шаблона

Проблема 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?

Ответы на вопрос(3)

Ваш ответ на вопрос