Это написать способ вызова API в L oop и использование асин c Awit - PullRequest
0 голосов
/ 08 марта 2020

У меня есть массив arr, я хочу l oop для каждого его элемента. В l oop я вызываю два fxns A (), а затем B (). Я хочу, чтобы l oop работал параллельно, но для каждого элемента сначала должен выполняться fxn A, а затем fxn B.

то, что я делаю, это:

[1,2,3].forEach(async(i)=>{
await A(i);//which call API & console & returns iA 
await B(i);//which call API & console & returns iB  
console.log('A & B Completed for '+ i) 
 }  )

//Desired Result

1A
1B
A & B Completed for 1
3A //due to parallelism
3B
A & B Completed for 3
2A
2B
A & B Completed for 2

Это написать или любым другим хорошим способом, пожалуйста, помогите.

1 Ответ

0 голосов
/ 08 марта 2020

Я хочу, чтобы l oop работал параллельно, но для каждого элемента сначала должен выполняться fxn A, а затем fxn B.

То, что у вас есть, будет делать это. .forEach() l oop сам не будет ждать await, потому что .forEach() не знает обетования. Таким образом, .forEach() l oop просто запустится до завершения, запустив каждую из ваших oop итераций (по порядку), так что все они будут "в полете" одновременно. Они начнутся по порядку, но при одновременном запуске в полете они могут завершиться в любом порядке (это определяется целевым сервером).

Но, как вы это делаете, вот так у вас нет никакого способа общения за пределами l oop ни для ошибок, ни для результатов, ни даже для завершения.

По этой причине, как правило, лучше (когда вы хотите запустить вещи параллельно) соберите массив обещаний и следите за его выполнением с помощью Promise.all(). Это даст вам все три вещи, которые вам не хватает:

  1. Уведомление о завершении
  2. Правильная обработка ошибок
  3. Сбор результатов в порядке

Вы можете сделать это так:

let promises = [1,2,3].map(async(i) => {
    let resultA = await A(i);//which call API & console & returns iA 
    let resultB = await B(i);//which call API & console & returns iB  
    console.log('A & B Completed for '+ i)
    return someValue; 
});

Promise.all(promises).then(results => { 
    console.log(results);
}).catch(err => {
    console.log(err);
});
...