javascript - 等待异步函数的循环
问题描述
我需要同步运行 startFunc 函数并在 for 循环中“等待”以完成任务,然后再次运行它。我不能在 startFunc() 中使用 await。我在 c# 中需要类似 .wait() 的东西,除了结果:start 1 end 1 start 2 end 2 etc...
function callToDB(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
console.log('start', i);
await callToDB(1000);
console.log('end', i);
}
for (let i = 0; i < 5; i++) {
startFunc(i);
}
解决方案
您还需要将for
循环放在一个async
函数中,这样您就可以await
每次调用startFunc
:
function callToDB(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
console.log('start', i);
await callToDB(1000);
console.log('end', i);
}
(async () => {
for (let i = 0; i < 5; i++) {
await startFunc(i);
}
})();
另一种方法是连续链接.then
s:
function callToDB(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
console.log('start', i);
await callToDB(1000);
console.log('end', i);
}
let prom = Promise.resolve();
for (let i = 0; i < 5; i++) {
prom = prom.then(() => startFunc(i));
}
或者您可以使用.reduce
并不断传递最后一个 Promise 作为累加器,而不是分配给外部变量:
function callToDB(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
console.log('start', i);
await callToDB(1000);
console.log('end', i);
}
const finalProm = Array.from({ length: 5 })
.reduce(
(lastProm, _, i) => lastProm.then(() => startFunc(i)),
Promise.resolve()
);
推荐阅读
- mysql - 使用 NOT-LIKE 子句对三个表进行 SQL 查询
- python - 具有 kernel_size=1 的 Conv1D 与线性层
- react-native - 使用 react-navigation 重构 - 使用分支时如何提升静态导航标题?
- javascript - 顶点页面准备好时返回的自定义 cypress 命令
- nlp - 解决单词多义/同音的最先进算法是什么?
- r - 为什么匹配的结果取决于数据的顺序(MatchIt 包)?
- python - Python 请求中的 CURL -T(--upload-file 等效项)
- c# - XML 文件中的 Linq 请求
- maven - 需要一个 Jenkins 作业,在运行自身之前先构建其所有依赖关系树
- git - 从 Git 分支中删除功能,然后将其合并回来?