#javascript #arrays #object #ecmascript-6 #promise
#javascript #массивы #объект #ecmascript-6 #обещание
Вопрос:
Что я хочу сделать, так это:
Выполните цикл над коллекцией данных, для каждого элемента данных выполните вызов API, дождитесь сбоя обещания или разрешения, сделайте паузу на 30 секунд … затем повторите это для следующего элемента данных, пока в коллекции не останется ничего, что можно было бы перебирать… наконец, отобразите сообщение «готово».
Пока что это код, который я написал, собирая идеи по другим вопросам SO, и это работает не так, как мне бы хотелось.
populateDB();
// these 2 helper functions were found on SO
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function sleep(fn, ...args) {
await timeout(30000);
return fn(...args);
}
// this is the main function that makes the api calls
function populateDB() {
for (let stock of universe.universe) {
sleep(() => {
// actual API call
return alpha.data
.daily(stock)
.then(data => {
// write data to the db when promise resolves
db.get("stocks")
.push({ [stock]: polishData(data) })
.write();
})
.catch(err => console.log(err));
});
}
console.log("Done!");
}
Все обещанные по-прежнему соединяются один за другим, паузы нет. Я не думаю, что понимаю Promises достаточно, чтобы отладить это… каким был бы код, который работал бы так, как мне бы хотелось?
Комментарии:
1.
async function populateDB
иawait sleep(() => {
2. большое спасибо, что это было так @JaromandaX. Хотите написать ответ?
Ответ №1:
Используйте async/await
в вашей populateDB
функции:
async function populateDB() {
for (let stock of universe.universe) {
await sleep(() => {
// actual API call
return alpha.data
.daily(stock)
.then(data => {
// write data to the db when promise resolves
db.get("stocks")
.push({ [stock]: polishData(data) })
.write();
})
.catch(err => console.log(err));
});
}
console.log("Done!");
}