Você está efetivamente usando promessas dentro da função do executor do construtor de promessa, então este é o antipadrão do construtor de Promise .
Seu código é um bom exemplo do principal risco: não propagar todos os erros com segurança. Leia porque lá .
Além disso, o uso de async
/ await
pode tornar as mesmas armadilhas ainda mais surpreendentes. Comparar:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
com um async
equivalente ingênuo (errado) :
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
Procure o último no console da web do seu navegador.
O primeiro funciona porque qualquer exceção imediata em uma função executora do construtor Promise convenientemente rejeita a promessa recém-construída (mas dentro de qualquer .then
você está por conta própria).
O segundo não funciona porque qualquer exceção imediata em uma async
função rejeita a promessa implícita retornada pela async
própria função .
Como o valor de retorno de uma função executora do construtor de promessa não é usado, isso é uma má notícia!
Seu código
Não há nenhuma razão que você não possa 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);
});
});
}
Porém, por que usar bibliotecas de controle de simultaneidade desatualizadas quando você tem await
?