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/ awaitpuede 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 asyncequivalente 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, .thenusted está solo).
El segundo no funciona porque cualquier excepción inmediata en una asyncfunción rechaza la promesa implícita devuelta por la asyncfunció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 myFunctioncomo 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?