JavaScript: ejecutar solo una promesa para múltiples solicitudes
Quiero que los objetos soliciten una promesa de JavaScript, pero no quiero que creen promesas separadas. La lógica que quiero lograr es la siguiente: comprobar si una promesa está pendiente, y solo si no lo está, crear una nueva promesa. ¿Es esto posible? Según la documentación, no puedo comprobar el estado de una promesa, solo puedo manejarla después de que se cumpla, pero no quiero llamar a los manejadores en cada solicitud de promesa, y no quiero ejecutar múltiples promesas si el callback de una promesa puede responder a todas las solicitudes anteriores...
El problema que estoy tratando de resolver de esta manera es obtener datos de un servidor externo y transmitirlos a través de un evento a múltiples objetos después de recibirlos.
Respuesta #1
Claro, esto es bastante fácil de lograr
var _p = null; // just a cache
function batchRequests(fn){
if(_p != null) return _p; // if we have an in-flight request, return it
_p = fn(); // otherwise start a new action
_p.then(function(){ _p = null; }, // delete cache on resolve
function(){ _p = null; }); // even on failure
return _p; // return the new in-flight request
}
Lo que te permite hacer:
function delay(){ // just for example, simulate a request
return new Promise(function(resolve){ setTimeout(resolve, 1000); });
}
var batched = function(){ return batchRequests(delay); };
batched().then(function(){ console.log("All these"); });
batched().then(function(){ console.log("execute after"); });
batched().then(function(){ console.log("one second, at the same time"); });
