Вывод результатов двух обещаний в один объект - PullRequest
0 голосов
/ 24 мая 2018

У меня есть две асинхронные функции, которые создают обещания.Обе функции используют один и тот же ввод i.

async function1(i) {}
async function2(i) {}

Я буду вызывать эти функции несколько раз с разными значениями для своего ввода, и я хочу сделать свой код максимально эффективным, поэтому я хочупоставьте в очередь обещания и сделайте так, чтобы они выполнялись параллельно, используя Promise.all().

. Тем не менее, я хочу получить один результат в качестве окончательного результата, который будет представлять собой массив объектов, таких как:

[
  {
    input: i,
    result1: result1,
    result2: result2
  },
  ...
]

Я выполнил это в два отдельных шага:

async function function1(i) {
  return i * i
}

async function function2(i) {
  return i * i * i
}

async function main() {
  var promises = []

  for (let i = 0; i < 10; i++) {
    let promise = function1(i)
      .then(function(result1) {
          return {i:i, result1:result1}
      });

    promises.push(promise)
  }

  var final = await Promise.all(promises)
  
  var promises2 = [];
  
  for (let i = 0; i < 10; i++) {
    let promise = function2(i)
    .then (function(result2) {
      final[i]['result2'] = result2;
    });
    
    promises2.push(promise);
  }
  
  await Promise.all(promises2)
  
  console.log(final)

}

main()

Тем не менее, я чувствую, что это можно сделать с помощью одного Promise.all().Можете ли вы сказать мне, как?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

async function function1(i)
{
    return i * i
}

async function function2(i)
{
    return i * i * i
}

async function main()
{
    const promises = [];

    for (let i = 0; i < 10; i++)
        promises.push(function1(i), function2(i));

    const results = await Promise.all(promises);
    const data = [];

    for (let i = 0; i < 10; i++)
    {
        const [result1, result2] = results.slice(i * 2, i * 2 + 2);
        data.push({ i, result1, result2 });
    }

    console.log(data);
}

main();

Это должно работать плавно и быстро.Функции function1 и function2 возвращают Promise с, если вы не await их, поэтому вставка их в массив promises не требует пояснений.

Затем вы ждете Promise.all, который ждет, пока все 20 выполненных обещаний не будут выполнены.Наконец, второй цикл проходит через обещания, которые были возвращены.

В моем коде я использовал деструктурирующие назначения .Я предполагаю, что они вам доступны, поскольку вы используете асинхронные функции, что означает, что вы можете использовать ES2017.

0 голосов
/ 24 мая 2018

РЕДАКТИРОВАТЬ: 333 ответ правильный, а не мой.У этого решения будет 2 пакета в очереди.

Думаю, я понял:

console.log("start")

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function function1(i) {
  await sleep(2000);
  return i * i
}

async function function2(i) {
  await sleep(2000);
  return i * i * i
}

async function main() {
  var promises = []

  for (let i = 0; i < 10; i++) {
    let a = function1(i);
    
    let b = function2(i);
    
    let promise = Promise.all([a,b]).then(
      function([resulta,resultb]) {
          return {i:i, result1: resulta, result2: resultb}
      });

    promises.push(promise)
  }

  var final = await Promise.all(promises)
  
  
  console.log(final)

}

main()

Обратите внимание, что я добавил функцию сна для проверки распараллеливания этих функций.Все запускается за 2 секунды, поэтому я думаю, что это оптимизировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...