Prisma GraphQL-Yoga: должны ли преобразователи быть асинхронными? - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь обернуть голову вокруг Prisma и GraphQL, используя GraphQL-Yoga. Одна вещь, которая меня озадачила в резольверах. В примерах Prisma (https://github.com/prisma/prisma-examples/blob/master/node/graphql/src/index.js) вызовы БД выглядят синхронными, например,

 Mutation: {
    signupUser: (parent, { email, name }, context) => {
      return context.prisma.createUser({
        email,
        name,
      })
    },

но я видел другие примеры, когда нужно await возврат из Призмы. Разве все эти вызовы доступа к БД не должны быть асинхронными, как

 Mutation: {
        signupUser: async (parent, { email, name }, context) => {
          return await context.prisma.createUser({
            email,
            name,
          })
        },

1 Ответ

3 голосов
/ 12 марта 2019

Во-первых, распознаватели (могут) вернуть обещание. Они не обязаны, но в обоих ваших примерах кода распознаватели возвращают обещание. Осваивайтесь с обещаниями, почти все асинхронные вещи выполняются с обещаниями в наши дни!

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

Первый пример явно возвращает Обещание. Второй пример делает то же самое, но неявно (здесь также не требуется ожидание, но это снова сделает его явным). Оба примера становятся более интересными, когда вы впоследствии изменяете значение:

signupUser: (parent, { email, name }, context) => {
  return context.prisma.createUser({
    email,
    name,
  }).then(user => {
    return { ...user, isCool: user.friends > 5 };
  });
}
// vs. async function
signupUser: async (parent, { email, name }, context) => {
  const user = await context.prisma.createUser({
    email,
    name,
  };
  return { ...user, isCool: user.friends > 5 };
}

Синтаксический сахар означает, что за ним нет никакой новой языковой функции. Часто компиляторы сначала разбирают синтаксис перед компиляцией (особенно в функциональных языках). В качестве ментальной модели вы можете представить асинхронные функции, которые будут переписаны в форму обещания. Это поможет понять, почему они всегда возвращают обещание и что они на самом деле делают. Понимая эту концепцию, вы поймете, что оба примера на самом деле асинхронны и что await в вашем примере является необязательным (но только потому, что оно следует за возвратом. Если вы посмотрите на второй пример, вы также можете увидеть, почему люди утверждают, что " async выглядит более синхронно ": он избавляется от обратных вызовов.

...