javascript - node - ¿Puedo hacer una promesa "floja" con Bluebird.js?
promise all compatibility (1)
Quiero una promesa que espere hasta que se llame antes de que se ejecute. Es decir, si en realidad nunca llamo, la promesa nunca se ejecutará.
es posible?
Realiza una función que crea y devuelve una promesa en la primera invocación, pero devuelve la misma promesa en cada invocación posterior:
function getResults() {
if (getResults.results) return getResults.results;
getResults.results = $.ajax(...); # or where ever your promise is being built
return getResults.results;
}
Las promesas no funcionan de tal manera que puedan soportar la carga diferida. Las promesas se crean mediante un código asíncrono para comunicar un resultado. Hasta que se haya invocado el código asíncrono, simplemente no hay promesa .
Ciertamente podrías escribir un objeto parecido a una promesa que hiciera una invocación floja, pero el código que generó estas promesas sería muy diferente:
// Accepts the promise-returning function as an argument
LazyPromise = function (fn) {
this.promise = null;
this.fn = fn
}
LazyPromise.prototype.then = function () {
this.promise = this.promise || fn();
this.promise.then.apply(this.promise, arguments)
}
// Instead of this...
var promise = fn();
// You''d use this:
var promise = new LazyPromise(fn);
Es mejor en este uso poco común hacer que la creación real de la promesa sea floja (como en cualquiera de los ejemplos anteriores), en lugar de tratar de hacer que las promesas mismas sean responsables de la evaluación perezosa.