无法在promise.all中检索响应

时间:2018-11-24 19:49:43

标签: node.js typescript firebase google-cloud-functions

我正在像下面进行并行通话。

let parllel_call: [Promise<any>, Promise<any>] = [
        Function1(xxxxReq),
        Function2(yyyyReq),
     ];
let parllel_call_result = await Promise.all(parllel_call);
console.log('parllel_call_result ', JSON.stringify(parllel_call_result));
let xxxxRes = parllel_call_result[0];
console.log('xxxxRes.status '+xxxxRes.status+' message '+xxxxRes.message+' message '+xxxxRes.data.message);
let yyyyRes = parllel_call_result[1];
console.log('yyyyRes.status '+yyyyRes.status+' message '+yyyyRes.message+' message '+yyyyRes.data.message);

下面是Function1。

async function Function1(xxxxReq) {
  console.log("Start - Function1");

  await axios
    .post(some_url, axxxxReq)
    .then(res => {

      console.log('response '+res.status+' message '+res.message);
      console.log("End - Function1");
      return res;
    })
    .catch(error => {
      console.error("error " + error);
      console.log("End - Function1");
      return error;
    });
}

下面是Function2。

async function Function2(yyyyReq) {
  console.log("Start - Function2");

  await axios
    .post(some_other_url, yyyyReq)
    .then(res => {
      console.log('response '+res.status+' message '+res.data.message);
      console.log("End - Function2");
      return res;
    })
    .catch(error => {
      console.error("error " + error);
      console.log("End - Function2");
      return error;
    });
}

我能够并行调用功能1和2,并能够在功能内获取响应。 但是,当兑现承诺并按照输入的顺序收集响应时,就不会从承诺中收集响应。 日志说null传递给Promise.all响应数组。

下面是执行日志。

info: Doing parllel call
Start - Function1
Start - Function2
info: response 200 message undefined
info: End - Function1
info: response 200 message undefined
info: End - Function2
parllel_call_result  [null,null]
error endAssesment TypeError: Cannot read property 'status' of undefined
info: Execution took 14323 ms, user function completed successfully

我在这里想念的东西。

1 个答案:

答案 0 :(得分:1)

您的async函数不返回任何值,因此它们返回的诺言将具有一个undefined解析后的值。您所拥有的return语句位于.then().catch()回调中。您在顶层实际上没有设置async函数的解析值的任何回报。您需要返回从await获得的值或摆脱await并返回诺言。

function Function2(yyyyReq) {
  console.log("Start - Function2");

  return axios
    .post(some_other_url, yyyyReq)
    .then(res => {
      console.log('response '+res.status+' message '+res.data.message);
      console.log("End - Function2");
      return res;
    })
    .catch(error => {
      console.error("error " + error);
      console.log("End - Function2");
      throw error;
    });
}

而且,一旦删除了await并从axios()调用中返回了Promise,您就不再需要函数async

此外,如果您希望.catch()仍然拒绝承诺,则需要重新抛出错误。


如果要保留async/await,则必须捕获并返回该值。

async function Function2(yyyyReq) {
  console.log("Start - Function2");

  let val = await axios
    .post(some_other_url, yyyyReq)
    .then(res => {
      console.log('response '+res.status+' message '+res.data.message);
      console.log("End - Function2");
      return res;
    })
    .catch(error => {
      console.error("error " + error);
      console.log("End - Function2");
      throw error;
    });
  return val;
}