Prisma GraphQL瑜伽:解析程序需要异步吗?

Prisma GraphQL瑜伽:解析程序需要异步吗?,graphql,prisma,prisma-graphql,Graphql,Prisma,Prisma Graphql,我试着用GraphQL瑜伽把我的头绕在Prisma和GraphQL身上。有一件事让我困惑不解。在Prisma示例中,DB调用似乎是同步的,例如 Mutation: { signupUser: (parent, { email, name }, context) => { return context.prisma.createUser({ email, name, }) }, 但我也看到过其他例子,人们必须等待普里

我试着用GraphQL瑜伽把我的头绕在Prisma和GraphQL身上。有一件事让我困惑不解。在Prisma示例中,DB调用似乎是同步的,例如

 Mutation: {
    signupUser: (parent, { email, name }, context) => {
      return context.prisma.createUser({
        email,
        name,
      })
    },
但我也看到过其他例子,人们必须等待普里斯玛的回归。所有这些DB访问调用不都应该是异步的吗

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

首先,解析器可以返回一个承诺。它们不必这样做,但在您的两个代码示例中,解析器都会返回一个承诺。习惯于承诺,现在几乎所有异步的事情都是通过承诺来完成的

接下来,您应该了解JavaScript中的异步函数。async/await是承诺的语法糖。因此,即使你不在里面使用wait,他们也会回报你一个承诺

第一个示例显式返回一个承诺。第二个例子也做了同样的事情,但是这里不需要wait,但是这会使它再次显式。当您事后实际修改值时,这两个示例都会变得更有趣:

注册用户:父,{email,name},上下文=>{ 返回context.prisma.createUser{ 电子邮件 名称 }.thenuser=>{ 返回{…user,isCool:user.friends>5}; }; } //vs.异步函数 注册用户:异步父级,{email,name},上下文=>{ const user=wait context.prisma.createUser{ 电子邮件 名称 }; 返回{…user,isCool:user.friends>5}; } 句法上的糖分意味着它背后没有实际的新语言特征。通常,编译器在编译语法之前,尤其是在函数式语言中,首先对语法进行去语法。作为一个心智模型,您可以想象将异步函数重写为承诺形式。这将使人们更容易理解为什么他们总是回报承诺,以及他们实际上在做什么。
掌握了这个概念后,您将了解到这两个示例实际上是异步的,并且示例中的wait是可选的,但只是因为它遵循返回。如果你看第二个例子,你可能也会明白为什么人们说异步看起来更同步:它摆脱了回调。

首先,解析程序可以返回一个承诺。它们不必这样做,但在您的两个代码示例中,解析器都会返回一个承诺。习惯于承诺,现在几乎所有异步的事情都是通过承诺来完成的

接下来,您应该了解JavaScript中的异步函数。async/await是承诺的语法糖。因此,即使你不在里面使用wait,他们也会回报你一个承诺

第一个示例显式返回一个承诺。第二个例子也做了同样的事情,但是这里不需要wait,但是这会使它再次显式。当您事后实际修改值时,这两个示例都会变得更有趣:

注册用户:父,{email,name},上下文=>{ 返回context.prisma.createUser{ 电子邮件 名称 }.thenuser=>{ 返回{…user,isCool:user.friends>5}; }; } //vs.异步函数 注册用户:异步父级,{email,name},上下文=>{ const user=wait context.prisma.createUser{ 电子邮件 名称 }; 返回{…user,isCool:user.friends>5}; } 句法上的糖分意味着它背后没有实际的新语言特征。通常,编译器在编译语法之前,尤其是在函数式语言中,首先对语法进行去语法。作为一个心智模型,您可以想象将异步函数重写为承诺形式。这将使人们更容易理解为什么他们总是回报承诺,以及他们实际上在做什么。
掌握了这个概念后,您将了解到这两个示例实际上是异步的,并且示例中的wait是可选的,但只是因为它遵循返回。如果你看第二个例子,你可能也会明白为什么人们说异步看起来更同步:它摆脱了回调。

使用静态类型对我也有很大帮助:它迫使我对值的类型有所了解。Prisma客户端还提供了Flow和TypeScript的类型!对我也有很大帮助的是使用静态类型:它迫使我了解值的类型。Prisma客户端还提供了Flow和TypeScript的类型!