【问题标题】:GraphQL fields as a functionGraphQL 字段作为函数
【发布时间】:2017-01-27 12:17:09
【问题描述】:

我正在研究GraphQL,在编写GraphQLObjectTypefields 时,我对特定问题的不同实现感到有些困惑。
这两种实现有什么区别?

1.

var schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'RootQueryType',
    fields: {  // as object
      echo: {
        type: GraphQLString,
        args: {
          email: { type: EmailType }
        },
        resolve: (root, {email}) => {
          return email;
        }
      }
    }
  })
});
var ComplicatedArgs = new GraphQLObjectType({
  name: 'ComplicatedArgs',
  fields: () => ({ // as function
    complexArgField: {
      type: GraphQLString,
      args: {
        complexArg: { type: ComplexInput }
      },
    }
  }),
});

【问题讨论】:

  • 您具体指的是什么区别?第一个 sn-p 创建一个带有查询类型和可解析 echo 字段的完整模式,第二个 sn-p 只创建一个带有 complexArgField 字段且没有解析器的对象类型。

标签: javascript graphql graphql-js


【解决方案1】:

当您需要进行循环引用时。

在这里寻找我的类似答案

Dynamically creating graphql schema with circular references

【讨论】:

  • 那么您认为始终将fields 用作函数是一种好习惯吗?
  • 那是强烈的意见,但在我看来是!对性能影响不大
【解决方案2】:

这是 CLOSURE 的一个很好的例子。假设您在一个文件中有两种类型,并且它们相互引用。

const BookType= new GraphQLObjectType({
    name: 'BookType',
    fields: {  // as object
      author: {
        type: AuthorType,
        
        resolve: (parentValue, args) => {
          // query the author based on your db implementation.
        }
      } }
  })

BookType 有一个字段 author 并引用 AuthorType。现在假设您在“BookType”下定义了引用 BookType

的 AuthorType
const AuthorType= new GraphQLObjectType({
    name: 'AuthorType',
    fields: {  // as object
      books: {
        type: new GraphQLList(BookType), //one author might have multiple books
        
        resolve: (parentValue, args) => {
          // query the books based on your db implementation.
        }
      } }
  })

所以当Javascript引擎需要使用BookType时,会看到fields.author.type是AuthorType,而AuthorType在上面没有定义。所以它会给

reference error:AuthorType is not defined

为了规避这一点,我们将字段转换为函数。这个函数是一个 CLOSURE 函数。这是为什么闭包如此有用的一个很好的例子。

当 js 引擎首先读取文件时,它会将函数内部引用的所有变量保存到内存堆中,作为该函数的闭包存储。 BookType.fields 需要的所有变量都存储在 BookType.fields() 的闭包环境中。所以现在如果 javascript 执行 Booktype.fields(),它会检查函数内部是否定义了“AuthorType”,它没有定义所以它检查它的闭包存储,AuthorType 已经存储在那里,所以它使用它。

【讨论】:

  • 很好的答案,解释了 JavaScript 的闭包提升行为。
猜你喜欢
  • 2018-08-15
  • 2021-02-10
  • 2021-07-18
  • 2015-11-20
  • 2017-01-17
  • 2016-06-30
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多