Помимо включения await
, async
неявно переносит результат функции в Promise.resolve()
.Примерно:
async function() {
return something;
}
Эквивалентно:
function() {
return Promise.resolve(something);
}
Эта вещь Promise.resolve()
"выравнивает" свой аргумент, то есть, если его аргумент является thenable (например, еще одно обещание) оно автоматически «разрешается».Другими словами, Promise.resolve(somethingThatIsAPromise).then(<work>)
имеет тот же эффект, что и somethingThatIsAPromise.then(<work>)
.
MDN пытается объяснить это поведение (жирный шрифт мой):
Метод Promise.resolve()
возвращает объект Promise
, который разрешается с данным значением. Если значение является обещанием, это обещание возвращается ;если значение является доступным (т. е. имеет метод "then
" ), возвращенное обещание будет "следовать" этому доступному, принимая его возможное состояние;в противном случае возвращенное обещание будет выполнено со значением.Эта функция объединяет вложенных слоев объектов, подобных обещанию (например, обещание, которое превращается в обещание, которое разрешается во что-то), в один слой.
И, начиная с того, что ваша стрелкаФункция Returns (dataSources.userAPI.findOrCreateUser()
) - это Обещание, из-за того, что «сплющивание», имеющее async
или нет, приводит к тому же поведению.