Выход из forEach до выполнения обещания - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь вызвать запрос внутри цикла 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');

Этот код ^ logs

HERE
1
2
6
4
5
3

(числа в случайном порядке, это не очень важно для меня)

но я хочу, чтобы он регистрировался

1
2
3
4
5
6
HERE

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Еще один пример здесь. Вы можете использовать также для

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);
0 голосов
/ 18 января 2019

Вы не можете использовать forEach в такой ситуации.

Вместо этого, поскольку вы используете параллелизм на основе обещаний, вам придется превратить каждый запрос в обещание (arr.map(num => ...)), а затем обернуть все из них в Promise.all, который сам возвращает обещание, которое разрешается после все завернутые обещания решаются.

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");
});
...