Если функция async
возвращает Обещание, то Обещание, возвращаемое этой функцией, преобразуется в то же значение, что и исходное Обещание. Это можно увидеть на простом примере:
async function foo() {
return Promise.resolve(42);
}
console.log(await foo()); // "42", not "Promise { 42 }"
Так что в большинстве обычных ситуаций мы можем просто представить, что Promise, возвращаемый кодом внутри тела функции asyn c, возвращается без прикосновения. Но, как вы и наткнулись, даже несмотря на то, что Promise, возвращаемый асинхронной c функцией, будет преобразован в то же значение, что и Promise, возвращаемый кодом, фактический объект Promise не обязательно будет таким же:
let p1;
async function foo() {
p1 = Promise.resolve(42);
return p1;
}
let p2 = foo();
console.log('p1 === p2 ?', p1 === p2); // "false" (!)
Итак, мы видим, что объект Promise, возвращаемый вызовом функции, на самом деле отличается от объекта Promise, возвращаемого телом функции. Однако независимо от того, что он даст тот же результат, когда мы await
его (или используем Promise.then()
):
let p1;
async function foo() {
p1 = Promise.resolve(42);
return p1;
}
let p2 = foo();
console.log(await p1); // '42'
console.log(await p2); // also '42'
(обратите внимание, что для запуска этих примеров, например, в оболочке repl узла, вы ' Вам нужно будет обернуть их как:
async function main() {
/* code using async / await here */
}
main();