Я пытаюсь создать объект на основе ответов от нескольких обещаний, но я заметил, что на самом деле работает только первое обещание, а второе игнорируется. Какова наилучшая практика для выполнения этой работы?
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) {}
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, вы упустили одну из фундаментальных особенностей 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
})
}
Спасибо за ценный отзыв. Я собираюсь попробовать, так как это определенно выглядит многообещающе.
Я вижу что ты тут делал
awaitможет работать только как прямой дочерний элемент функцииasync.