У меня есть следующий код:
* Fetch stats from api
*/
fetchStats() {
this._isFetching = true;
// fetch stats after building url and replacing invalid characters
return new Promise(async (resolve, reject) => {
await API.fetchStats(this.rsn)
.then(jres => {
this.skills = jres.main.skills;
this._isFetching = false;
resolve('success');
})
.catch(err => {
console.log(err);
console.log('error retreiving stats');
this._isFetching = false;
reject('Failed to retreive stats');
})
.finally(() => {
this._isFetching = false;
});
});
}
Я думал, что асинхронный с ожиданием заставит его ждать, пока он не получит ответ, прежде чем продолжить. Возвращение обещания - это то, что я добавил в тестирование, чтобы посмотреть, смогу ли я сделать его синхронным.
Тогда мой код, который использует этот метод:
memberCollection.forEach(async el => {
await el.player.fetchStats()
.then(() => {
console.log(`Refreshed ${el.player.rsn}'s account`);
})
.catch(console.log(`Failed to refresh ${el.player.rsn}'s account`));
});
Я думал, что он подождет, пока не получит ответ, а затем console.log
будет либо успешное обновление, либо неудачное обновление. Вместо этого я вижу целую кучу «успешных» сообщений, за которыми следует строка с ошибочными сообщениями, указывающими на то, что он выполняет и сообщения then, и сообщение catch в foreach. Кто-нибудь знает, как я могу сделать эту работу.
Моя проблема в том, что Axios не работает по тайм-ауту (я предполагаю, что это связано с количеством отправляемых запросов и тем, что есть 5-10 секундзадержка при извлечении из базы данных), если я перехожу к URL-адресу API вручную, он работает так же, как если бы я просто использовал один элемент (в отличие от forEach), он работал нормально. Поэтому я пытаюсь ограничить количество сработавших запросов одновременно. Я попытался установить тайм-аут моего axios на 10, 20 и 60 секунд, но это не улучшило ситуацию.
Код решения:
const asyncForEach = async (arr, cb) => {
for(let i=0;i<arr.length;i++) {
let el = arr[i];
try {
let res = await cb(el);
} catch (err) { console.log(err) };
if(el.player && el.player.rsn) console.log(`Processed ${el.player.rsn}`);
}
console.log('done processing in asyncForEach');
}