Tengo el código para mi implementación de Promise.race(), y básicamente funciona . Sin embargo, en este caso:
promiseRace([Promise.reject('test_error'), Promise.resolve('test_value')])
test_value
en lugar de test_error
.
¿Por qué sucede?
const promiseRace = promises => new Promise((resolve, reject) => { promises.forEach(p => { if ( typeof p === 'object' && 'then' in p && typeof p.then === 'function' ) { p.then(resolve).catch(reject); } else { resolve(p); } }); }); promiseRace([Promise.reject('test_error'), Promise.resolve('test_value')]).then(value => { console.log(value); });
Esto sucede porque en la siguiente línea llamas a .catch
en otra promesa (encadenada), no en la promesa original:
p.then(resolve).catch(reject);
Tenga en cuenta cómo la llamada then
no recibe un argumento de devolución de llamada de reject
, por lo que hay un ciclo de promesa asíncrono intermedio adicional. En el momento en que se llama a la devolución de llamada .catch
( reject
), el otro caso ya se ha tratado (la promesa cumplida).
Así que cambia a:
p.then(resolve, reject);