Почему нет возврата-ожидания vs const x = ждут?

В чем разница между

return await foo()

а также

const t = await foo();
return t

http://eslint.org/docs/rules/no-return-await

Ответы

Ответ 1

В принципе, потому что return await является избыточным.

Посмотрите на это с немного более высокого уровня, как вы фактически используете функцию async:

const myFunc = async () => {
  return await doSomething();
};

await myFunc();

Любая async функция уже собирается вернуть Promise и должна рассматриваться как Promise (либо непосредственно как Promise, либо также await -ing.

Если вы await внутри функции, она избыточна, потому что функция снаружи также будет await ее каким-то образом, поэтому нет причин не просто посылать Promise и позволить ей разбираться с ней.

Это не является синтаксически неправильным или неправильным и обычно не вызывает проблем. Это просто полностью избыточно, поэтому на нем срабатывает линкер.

Ответ 2

Использование return await имеет некоторые недавно представленные преимущества в движке v8, используемом в Node.js, Chrome и некоторых других браузерах:

В v8 введен флаг --async-stack-traces, который с V8 v7.3 включен по умолчанию (Node.js v12.0.0).

Этот флаг обеспечивает улучшенный опыт разработчика, обогащая свойство стека ошибок с помощью трассировки стека асинхронных функций.

async function foo() {
  return bar();
}

async function bar() {
  await Promise.resolve();
  throw new Error('BEEP BEEP');
}

foo().catch(error => console.log(error.stack));


Error: BEEP BEEP
    at bar (<anonymous>:7:9)

Обратите внимание, что при вызове return bar(); вызов функции foo() вообще не появляется в стеке ошибок. Изменение его на return await bar(); дает намного лучший вывод стека ошибок:

async function foo() {
  return await bar();
}

Error: BEEP BEEP
    at bar (<anonymous>:7:9)
    at async foo (<anonymous>:2:10)

Это действительно обеспечивает намного лучшую трассировку стека ошибок, поэтому НАСТОЯТЕЛЬНО рекомендуется всегда ждать ваших обещаний.

Кроме того, async/wait теперь превосходит рукописные обещания:

async/await теперь превосходит рукописный код обещания. Ключевым выводом здесь является то, что мы значительно сократили накладные расходы на асинхронные функции - не только в V8, но и во всех движках JavaScript, исправив спецификацию. Источник

Подробнее об этих изменениях читайте в блоге v8.dev: https://v8.dev/blog/fast-async#improved-developer-experience

Ответ 3

Потому что вы можете просто

async function() {
  return foo();
}

Возвращаемый результат async function всегда является Promise, независимо от того, вы возвращаете точное значение или другой объект Promise внутри тела функции