Как сделать несколько асинхронных вызовов ожидания

Я пытаюсь создать объект на основе ответов от нескольких обещаний, но я заметил, что на самом деле работает только первое обещание, а второе игнорируется. Какова наилучшая практика для выполнения этой работы?

if (goldenListKeys[0].name === 'date') {
  const date = moment('07-01-2019', 'YYYY-MM-DD').format('MM/DD/YYYY');
  _.assign(tmpObj, { inputData: { [goldenListKeys[0].name]: date } });
  try {
    await this.plansApi
      .compileFields({ tmpObj, carrier, benefitQuery })
      .catch(error => {
        value = error.response['invalid-selection'];
        console.info(`One: ${value}`);
      });
  } catch (err) {}
}
if (goldenListKeys[1].name === 'state') {
  console.info('Here');
  _.assign(tmpObj, {
    inputData: { ...tmpObj, [goldenListKeys[1].name]: 'NC' },
  });
  try {
    await this.plansApi
      .compileFields({ tmpObj, carrier, benefitQuery })
      .catch(error => {
        value = error.response['invalid-selection'];
        _.assign(goldenListKeys, { filler: value });
        console.info(`Two: ${value}`);
      });
  } catch (err) {}
}
await может работать только как прямой дочерний элемент функции async.
zer00ne 23.05.2019 01:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
182
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы упустили одну из фундаментальных особенностей async/await.

An async function can contain an await expression that pauses the execution of the async function and waits for the passed Promise's resolution, and then resumes the async function's execution and returns the resolved value.

Ключевая часть заключается в том, что выполнение внутри вызова функции приостанавливается. Таким образом, ваш следующий оператор if не будет рассматриваться до тех пор, пока не будет разрешено первое обещание.

от https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Обычно мне нравится использовать функцию Promise.all MDN-ссылка.

Вот как я бы изменил ваш код (я знаю, что он не использует async/await, но он должен достичь вашей цели)

function yourFunction(){

    let myPromiseArray = [];

    if (goldenListKeys[0].name === 'date') {

        const date = moment('07-01-2019', 'YYYY-MM-DD').format('MM/DD/YYYY');

        _.assign(tmpObj, { inputData: { [goldenListKeys[0].name]: date } });

        myPromiseArray.push(his.plansApi
            .compileFields({ tmpObj, carrier, benefitQuery }))
    }

    if (goldenListKeys[1].name === 'state') {

        _.assign(tmpObj, {
            inputData: { ...tmpObj, [goldenListKeys[1].name]: 'NC' },
        });

        myPromiseArray.push(this.plansApi
            .compileFields({ tmpObj, carrier, benefitQuery }))

    }

    Promise.all(myPromiseArray).then((resultArray)=>{
        //do something with results
    }).catch(errorArray => {
        //handle Errors
    })
}

Спасибо за ценный отзыв. Я собираюсь попробовать, так как это определенно выглядит многообещающе.

pingeyeg 23.05.2019 16:37

Я вижу что ты тут делал

Michael Sorensen 23.05.2019 19:13

Другие вопросы по теме