Почему асинхронная функция ожидания возвращает значение, а функция обещания возвращает неопределенное значение? - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь понять следующие 2 примера функций, используя async-await и обещание.

Я ожидаю, что обе функции вернут "output", но функция, использующая обещание, вместо этого возвращает неопределенное значение.

Почему это так? Я уже возвращаю значение в promise.resolve (). Then (), но в конце концов значение не возвращается.

Я столкнулся с этой проблемой, работая над моим проектом. Я использовал подход обещания, чтобы возвратить значение, но значение не возвращено. Затем я решил эту проблему с помощью async-await, но я не мог понять, почему?

async function asyncFunction(input) {
  try {
    let output = await Promise.resolve("output");
    return output;
  } catch (err) {
    console.log(err);
  }
}

function promiseFunction(input) {

    Promise.resolve().then(function() {
      return "output";
    }).catch(function(err){
      console.log(err);
    })
}

async function run() {
  let a = await asyncFunction();
  let b = await promiseFunction(); 

  console.log("async function output: " + a); //async function output: output
  console.log("promise function output: " + b); //promise function output: undefined
}

run();


Я ожидаю, что asyncFunction () и promiseFunction () вернут значение «output», но обещание обещает, что undefined не определен.

1 Ответ

2 голосов
/ 29 сентября 2019

async функции всегда возвращают обещания. Если вы опускаете оператор возврата в обычной функции, такой как:

function doSomething(x) {
  x.y = 2;
}

, тогда он возвращает неопределенное значение.

doSomething({}) === undefined // true

Если вы опускаете оператор возврата в async функции

async function doSomething(x) {
  x.y = 2;
}

возвращает обещание, которое разрешается с неопределенным

doSomething({}).then(result => result === undefined); // resolves to be true

В вашей функции, отличной от async, вы ничего не возвращаете. Вам нужно return Promise.resolve().then(...) строка. Это одно из преимуществ использования синтаксиса async/await. Не нужно беспокоиться о правильной цепочке своих обещаний и возвращении. Просто сделайте свою работу, await, где это необходимо, и return значение.

...