Почему нет возврата-ожидания 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
внутри тела функции