我想做的是这样:
遍历数据集合,为每个数据元素调用一个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的理解不足以调试它...可以按照我希望的方式工作的代码是什么?
答案 0 :(得分:3)
在populateDB
函数中使用async/await
:
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!");
}