如何进行多个异步等待调用

时间:2019-05-22 23:22:15

标签: javascript

我试图基于来自多个promise的响应来构建一个对象,但是我注意到实际上只有第一个promise被执行,而第二个promise被忽略了。进行这项工作的最佳做​​法是什么?

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.log(`One: ${value}`);
      });
  } catch (err) {}
}
if (goldenListKeys[1].name === 'state') {
  console.log('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.log(`Two: ${value}`);
      });
  } catch (err) {}
}

1 个答案:

答案 0 :(得分:1)

您似乎错过了async / await的基本功能之一。

  

异步函数可以包含await表达式,该表达式会暂停异步函数的执行并等待所传递的Promise的分辨率,然后恢复异步函数的执行并返回解析的值。

关键部分是函数调用内部的执行已暂停。因此,只有在第一个承诺解决后,您才会考虑下一个if语句。

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

通常我在这里使用Promise.all函数MDN Link

这就是我修改您的代码的方式(我知道它不使用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
    })
}