Невозможно получить ответ в обещании. - PullRequest
0 голосов
/ 24 ноября 2018

Я выполняю параллельный вызов, как показано ниже.

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);

Ниже находится функция 1.

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;
    });
}

Ниже находится функция 2.

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 голосов
/ 24 ноября 2018

Ваши 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() вам также не нужно, чтобы ваша функция была больше 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...