then promesas funciones encadenar encadenamiento ejecucion controlar asincronia asincrona javascript promise ecmascript-6 es6-promise

javascript - funciones - promesas typescript



¿Por qué esta cadena de promesas se resuelve inmediatamente? (2)

var d = [a, b, c].reduce(function (previousPromise, promise) { return previousPromise.then(promise); }, Promise.resolve());

Se ha resuelto tu estado inicial de d promesa, tu set es como Promise.resolve (). Consulte la documentación de reducir https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

¿Puede alguien explicarme por qué la promesa resultante ( d ) del código siguiente se resuelve de inmediato?

//promises that are never resolved nor rejected var a = new Promise(function(r,re){}); var b = new Promise(function(r,re){}); var c = new Promise(function(r,re){}); var d = [a, b, c].reduce(function (previousPromise, promise) { return previousPromise.then(promise); }, Promise.resolve());

Estoy creando una serie de promesas que están pendientes para siempre, por lo que la promesa resultante también debería estar pendiente para siempre, ya que espera a que finalicen todas las promesas posteriores ( como se presenta aquí ). He estado usando promesas desde hace un tiempo, pero claramente me falta algo aquí.


then no toma una Promise como entrada, toma 2 funciones, 1 para cumplimiento y 1 para rechazo.

La razón por la que d se resuelve se debe al hecho de que al invocar .then con un valor no recuperable (incluso un número literal - 1, o undefined ), la función onFulfilled se reemplaza por "Identity", que simplemente se reajusta con lo que sea el valor se resolvió en el paso anterior. Ver PerformPromiseThen

Pruebe de esta manera:

//promises that are never resolved nor rejected var a = function() { return new Promise(function(r,re){}); }; var b = function() { return new Promise(function(r,re){}); }; var c = function() { return new Promise(function(r,re){}); }; // or simply, a = b = c after setting the function for c var d = [a, b, c].reduce(function (previousPromise, fn) { return previousPromise.then(fn, /* not passing a rejection handler... */); }, Promise.resolve());

O alternativamente...

//promises that are never resolved nor rejected var a = new Promise(function(r,re){}); var b = new Promise(function(r,re){}); var c = new Promise(function(r,re){}); var d = [a, b, c].reduce(function (previousPromise, promise) { return previousPromise.then(function() {return promise;}); }, Promise.resolve());

Y como está utilizando promesas y ES6, podría ser más conciso:

let a = new Promise(() => {}); let b = new Promise(() => {}); let c = new Promise(() => {}); let d = [a, b, c].reduce((previousPromise, promise) => previousPromise.then(() => promise), Promise.resolve());