Estou usando a async.eachLimit
função para controlar o número máximo de operações por vez.
const { eachLimit } = require("async");
function myFunction() {
return new Promise(async (resolve, reject) => {
eachLimit((await getAsyncArray), 500, (item, callback) => {
// do other things that use native promises.
}, (error) => {
if (error) return reject(error);
// resolve here passing the next value.
});
});
}
Como você pode ver, não posso declarar a myFunction
função como assíncrona porque não tenho acesso ao valor dentro do segundo retorno de chamada da eachLimit
função.
javascript
node.js
asynchronous
async-await
Alexis Tyler
fonte
fonte
Respostas:
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 => { ""(); // TypeError resolve(); }); (async () => { await p; })().catch(e => console.log("Caught: " + e)); // Catches it.
com um
async
equivalente ingênuo (errado) :let p = new Promise(async resolve => { ""(); // TypeError resolve(); }); (async () => { await p; })().catch(e => console.log("Caught: " + e)); // Doesn't catch it!
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 pelaasync
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
comoasync
:async function myFunction() { let array = await getAsyncArray(); return new Promise((resolve, reject) => { eachLimit(array, 500, (item, callback) => { // do other things that use native promises. }, error => { if (error) return reject(error); // resolve here passing the next value. }); }); }
Porém, por que usar bibliotecas de controle de simultaneidade desatualizadas quando você tem
await
?fonte
return await
:return new Promise
é suficiente.Eu concordo com as respostas dadas acima e ainda assim, às vezes é mais legal ter assíncrono dentro de sua promessa, especialmente se você quiser encadear várias operações retornando promessas e evitar o
then().then()
inferno. Eu consideraria usar algo assim nessa situação:const operation1 = Promise.resolve(5) const operation2 = Promise.resolve(15) const publishResult = () => Promise.reject(`Can't publish`) let p = new Promise((resolve, reject) => { (async () => { try { const op1 = await operation1; const op2 = await operation2; if (op2 == null) { throw new Error('Validation error'); } const res = op1 + op2; const result = await publishResult(res); resolve(result) } catch (err) { reject(err) } })() }); (async () => { await p; })().catch(e => console.log("Caught: " + e));
Promise
construtor não é assíncrona, portanto, os linters não mostram erros.await
.Uma desvantagem, porém, é que você deve se lembrar de colocá
try/catch
-lo e prendê-loreject
.fonte
static getPosts(){ return new Promise( (resolve, reject) =>{ try { const res = axios.get(url); const data = res.data; resolve( data.map(post => ({ ...post, createdAt: new Date(post.createdAt) })) ) } catch (err) { reject(err); } }) }
remove await e async resolverá esse problema. porque você aplicou o objeto Promise, isso é o suficiente.
fonte
axios.get(url)
funcionará como se fosse chamado deawait axios.get(url)
?