Можно ли вернуть разрешенное значение из обещания без async / await? - PullRequest
0 голосов
/ 16 июня 2019

Я следую инструкциям Apollo (https://www.apollographql.com/docs/tutorial/resolvers/), и я увидел этот код:

me: async (_, __, { dataSources }) =>
  dataSources.userAPI.findOrCreateUser()

Потому что dataSources.userAPI.findOrCreateUser() возвращает Обещание , подумал я что await dataSources.userAPI.findOrCreateUser() был прав.

Но он работал очень хорошо без каких-либо ошибок, и я получил решенное значение в React ... даже этот код ниже тоже работает хорошо.

me: (_, __, { dataSources }) =>
  dataSources.userAPI.findOrCreateUser()

Этот код меня смущает. Как это работает?

1 Ответ

1 голос
/ 16 июня 2019

Помимо включения 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 или нет, приводит к тому же поведению.

...