Está utilizando efectivamente promesas dentro de la función ejecutora del constructor de promesas, por lo que este es el anti-patrón del constructor de promesas .
Su código es un buen ejemplo del riesgo principal: no propagar todos los errores de forma segura. Lea por qué hay .
Además, el uso de async
/ await
puede hacer que las mismas trampas sean aún más sorprendentes. Comparar:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
con un async
equivalente ingenuo (incorrecto) :
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
Busque en la consola web de su navegador el último.
El primero funciona porque cualquier excepción inmediata en una función ejecutora del constructor de Promise rechaza convenientemente la promesa recién construida (pero dentro de cualquiera, .then
usted está solo).
El segundo no funciona porque cualquier excepción inmediata en una async
función rechaza la promesa implícita devuelta por la async
función misma .
Dado que el valor de retorno de una función ejecutora del constructor de promesas no se utiliza, ¡son malas noticias!
Tu codigo
No hay ninguna razón por la que no pueda definir myFunction
como async
:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
}, error => {
if (error) return reject(error);
});
});
}
Aunque, ¿por qué usar bibliotecas de control de simultaneidad obsoletas cuando las tiene await
?