Проблема в обработке асинхронной функции, вызываемой другой функцией - PullRequest
0 голосов
/ 09 октября 2018

Вкратце, у меня есть 2 функции A, B

A - асинхронная функция, требуется время, чтобы запросить что-то, затем будьте готовы с ответом на возврат

B, берите выход из A

вот мои коды

async function A()
{
    axios.get('API_ENDPOINT_URL').then(async function (rates) {
        return new Promise((resolve , reject) => {
            resolve(rates.data.data);
        });
    });
}

async function B(id)
{
    var results = A();
    console.log(results); // this output Promise { undefined }
}

как решить эту проблему?

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

На самом деле здесь нет особой причины, по которой вам нужно async или await.Вы также можете просто вернуть значение из обработчика .then(), который будет работать в любой среде, которая поддерживает axios (не требует поддержки async / await):

function A() {
    return axios.get('API_ENDPOINT_URL').then(function (rates) {
        return rates.data.data;
    });
}

// usage
A().then(result => {
   console.log(result);
}).catch(err => {
   console.log(err);
});

В случае, если вы этого не поняли,и эта версия, и версия выше с использованием await возвращают одно и то же - обещание, которое разрешается до rates.data.data или отклоняется с ошибкой axios.

Возвращение значения из обработчика .then() изменяет разрешенное значениецепочки обещаний к возвращенному вами значению.

Если это значение не является также обещанием, в этом случае это обещание добавляется в цепочку, и разрешенное значение цепочки становится разрешенным значением этого нового обещания, которое вывернулся.

0 голосов
/ 09 октября 2018

Ваша функция A возвращает обещание, поэтому вы можете использовать await A() или A().then(results => console.log(results))

0 голосов
/ 09 октября 2018

У вас есть звонок. Затем по обещанию, как это:

function A()
{
  return new Promise((resolve , reject) => {
      resolve("test");
  });
}

function B()
{
  A().then(result=>console.log(result));
}

B();
0 голосов
/ 09 октября 2018
 var results = await A();

просто жду выполнения А. А также исправлю сам А, он совершенно не использует обещания:

 async function A() {
  const rates = await axios.get('API_ENDPOINT_URL')
  return  rates.data.data;
}
...