Насколько я понимаю, при использовании forEach()
в браузере ожидается, что обратный вызов будет выполняться синхронно.
Однако вы можете изменить свой код следующим образом (при условии, что родительская функция объявлена async
):
/*
The following changes require the calling function to be async
async function foo() { */
/* Express iteration with for..of to achieve desired behavior */
for(const client of sender.room()) {
const pokemon = await makePokemon(client.getPokemon());
client.setPokemon(pokemon);
console.log('.1');
}
for(const client of sender.room()) {
console.log('.2');
client.emit('redirect', {
yourPokemon: client.getPokemon(),
theirPokemon: client.getOpponent().getPokemon()
});
}
/* } */
В качестве альтернативы, как отмечает Патрик Робертс, вы можете express эту логику c частично с Promise.all()
. Одним из преимуществ этого подхода является то, что он позволяет отправлять сразу несколько async
задач (ie makePokemon
), а не последовательно (как в случае выше):
/* Map each client to a promise and execute all with Promise.all() */
Promise.all(sender.room().map(async(client) => {
const pokemon = await makePokemon(client.getPokemon());
client.setPokemon(pokemon);
console.log('.1');
}))
/* If all prior promises are resolved, continue with next iteration */
.then(() => {
for (const client of sender.room()) {
console.log('.2');
client.emit('redirect', {
yourPokemon: client.getPokemon(),
theirPokemon: client.getOpponent().getPokemon()
});
}
})