我正在尝试在forEach循环内调用请求,但是我的代码在循环完成之前就退出了循环。有没有办法确保循环在下一个代码执行之前完成? (我对诺言比较陌生)
我的代码采用以下格式:
let arr = [1, 2, 3, 4, 5, 6];
arr.forEach(num => {
return request('http://google.com')
.get('/')
.then(() => {
console.log(num);
});
});
console.log('HERE');
此代码^日志
HERE
1
2
6
4
5
3
(数字是随机顺序的,这对我而言并不重要)
但我希望它记录
1
2
3
4
5
6
HERE
我该怎么做?
答案 0 :(得分:2)
在这种情况下,您不能使用forEach
。
相反,由于使用的是基于承诺的并发,因此必须将每个请求转换为Promise(arr.map(num => ...)
),然后将所有请求包装在Promise.all中,该Promise.all本身会返回一个Promise在所有包装好的承诺都解决之后,解决。
let arr = [1, 2, 3, 4, 5, 6];
Promise.all(
arr.map(num =>
request("http://google.com")
.get("/")
.then(() => {
console.log(num);
})
)
).then(() => {
console.log("HERE");
});
答案 1 :(得分:2)
这里是另一个例子。您还可以用于
let array = [1, 2, 3, 4, 5, 6];
async function processArray(arr){
for (const num of array) {
await request('http://google.com').get('/');
console.log(num);
}
console.log('Done!');
}
processArray(array);