Promesse di promesse che devono ancora essere create senza l’utilizzo del pattern differito

Problema 1: è consentita solo una richiesta API in un dato momento, quindi le richieste di rete reali vengono accodate mentre ce n’è una che non è ancora stata completata. Un’app può chiamare il livello API in qualsiasi momento e aspettarsi una promise in cambio. Quando la chiamata all’API viene accodata, la promise per la richiesta di rete verrà creata in futuro, cosa restituire all’app? È così che può essere risolto con una promise “proxy” differita:

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(); } } 

Problema 2: alcune chiamate API vengono rimosse in modo che i dati da inviare vengano accumulati nel tempo e quindi inviati in un batch quando viene raggiunto un timeout. L’app che chiama l’API si aspetta una risposta in cambio.

 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; } 

Poiché differito è considerato un anti-modello, (vedi anche Quando qualcuno dovrebbe creare un differito? ), La domanda è – è ansible ottenere le stesse cose senza un rinvio (o hack equivalenti come la new Promise(function (resolve, reject) {outerVar = [resolve, reject]}); ), utilizzando l’API Promise standard?