Параллельно между циклами, несколько асинхронных операций в цикле, как добиться? - PullRequest
2 голосов
/ 01 ноября 2019

Мне нужно обрабатывать несколько асинхронных операций в цикле. Эти асинхронные операции я использую await , чтобы они выполнялись последовательно. В результате я хочу, чтобы циклы были последовательными, асинхронные операции в каждом цикле параллельны, но результат все выстроен. Как решить эту ситуацию?

Извините, я плохо владею английским языком. Я перевожу их с помощью Google.

В каждом цикле я использую await для работы с Promise , который имеет асинхронную операцию. Но все они последовательные.

Мой код такой:

var func1 = function(){return new Promise(function(resolve, reject){
    //After 10s print(1);
    loadRes("resname_1", 
        (res)=>{print(1); resolve(res);},
        (err)=>{reject(err);});
 })}

 var func2 = function(){return new Promise(function(resolve, reject){
    //After 10s print(2); 
    //some async operation like above
 })}

 var func3 = function(){return new Promise(function(resolve, reject){
    //After 10s print(3); 
    //some async operation like above
 })}


 var test = async function(){
    //some code...;
    await func1;

    //some code...;
    await func2;
    await func3;
 }

 for(let i = 0; i < 3; ++i){
    test();
 }

Результат, который я получил: 111222333, всего секунд: 90

Что я хочу: 123 123 123, всего секунд: около 30

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вы, кажется, ищете согласованный запуск асинхронных операций, а затем выполняете их одновременно, ожидая их с Promise.all. Затем await каждая итерация вашего цикла:

 for (let i = 0; i < 3; ++i){
     //some code...;
     const [a,b,c] = await Promise.all([
         func1(),
         func2(),
         func3(),
     ]);
     console.log(a+b+c); // to ensure the expected order
 }
1 голос
/ 01 ноября 2019

Вам нужно await test.

Если вы можете использовать ожидание верхнего уровня , вы можете просто получить:

for (let i = 0; i < 3; ++i) {
  await test();
}

В противном случае, вы можете использовать then, потому что, в конце концов, test возвращает Promise:

test()
  .then(test)
  .then(test)
  .then(() => console.log('Done'));

Но учтите, что ваш testфункция выполняет func1, func2 и func3 последовательно . Если вы хотите запустить их в параллельно , вы можете использовать Promise.all:

var test = async function() {
  await Promise.all([
    func1(),
    func2(),
    func3()
  ]);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...