Я хочу сделать следующее:
Зациклиться на наборе данных, для каждого элемента данных сделать вызов 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.info(err));
});
}
console.info("Done!");
}
Все обещанное до сих пор цепляется одно за другим нет паузы. Я не думаю, что понимаю промисы достаточно, чтобы отладить это... какой код будет работать так, как я хотел бы?
большое спасибо, это было @JaromandaX. Хотите написать ответ?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте 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.info(err));
});
}
console.info("Done!");
}
async function populateDBиawait sleep(() => {