javascript - JavaScript 在迭代数组时等待后端响应
问题描述
我正在使用 javascript,我希望在迭代下一个项目之前等待其他函数响应。
这是所需的行为:
let lista = [1,2,3,4]
console.log('Iteracion de la lista')
async function procesarLista(array){
for(const item of array){
console.log('-->START indice: ' + item)
//Simulate delay (for each iteration) of backend response
setTimeout(function(){
console.log('....waiting.... for : ' + item );
}, 2500);
console.log('-->FINISH indice: ' + item)
}
console.log('Done');
}
//Execute:
procesarLista(lista);
这是错误的结果:
解决方案
尝试await
在循环内的每次迭代中使用 Promise for
:
let lista = [1, 2, 3, 4]
console.log('Iteracion de la lista')
async function procesarLista(array) {
for (const item of array) {
await new Promise((resolve) => {
console.log('-->START indice: ' + item)
//Simulate delay (for each iteration) of backend response
setTimeout(function() {
console.log('....waiting.... for : ' + item);
resolve();
}, 500);
});
console.log('-->FINISH indice: ' + item)
}
console.log('Done');
}
//Execute:
procesarLista(lista);
for..of
需要再生器运行时。如果你没有那个,那么你可以使用reduce
,但你必须await
在循环内的最后一次迭代的分辨率和 await
记录之前的最终承诺Done
:
let lista = [1, 2, 3, 4]
console.log('Iteracion de la lista')
async function procesarLista(array) {
await new Promise ((outerResolve) => {
array.reduce(async (lastPromise, item) => {
await lastPromise;
await new Promise((resolve) => {
console.log('-->START indice: ' + item)
//Simulate delay (for each iteration) of backend response
setTimeout(function() {
console.log('....waiting.... for : ' + item);
resolve();
}, 500);
});
console.log('-->FINISH indice: ' + item)
}, Promise.resolve());
});
console.log('Done');
}
procesarLista(lista);
推荐阅读
- sql - MS Access:玩日期
- javascript - 用于创建 (p5.js) 主体的 for 循环
- go - 如何在 vim 中显示从 go(lang) 包中导入的可能函数/变量
- python - 如何为熊猫布尔掩码中的每个连续真值序列分配唯一的分组值
- python - 将列表名称创建为字符串后如何打印列表?
- .net - Sub 如何处理 FormClosing 和 Button.Click?
- python-3.x - 如何使用 PIL-python 显示具有透明背景的图像?
- r - 如何在 R 4.0.3 中为细胞计数脚本安装“rtiff”包
- redux - 如何在 Redux 工具包中创建全局错误切片,该切片将从其他切片接收错误值?
- connection-string - 如何在 app.config 中从 NLog 引用我的连接字符串