在完成承诺之前退出forEach

时间:2019-01-18 17:32:37

标签: javascript foreach request-promise

我正在尝试在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

我该怎么做?

2 个答案:

答案 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);