ita*_*ied 7 graphql graphql-js
我学习GraphQL,我得到一点从具体问题有不同的实现书写时感到困惑fields的GraphQLObjectType。
这两种实现有什么区别?
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;
}
}
}
})
});
Run Code Online (Sandbox Code Playgroud)
2.
var ComplicatedArgs = new GraphQLObjectType({
name: 'ComplicatedArgs',
fields: () => ({ // as function
complexArgField: {
type: GraphQLString,
args: {
complexArg: { type: ComplexInput }
},
}
}),
});
Run Code Online (Sandbox Code Playgroud)
这是 CLOSURE 的一个很好的例子。想象一下,一个文件中有两种类型,并且它们相互引用。
const BookType= new GraphQLObjectType({
name: 'BookType',
fields: { // as object
author: {
type: AuthorType,
resolve: (parentValue, args) => {
// query the author based on your db implementation.
}
} }
})
Run Code Online (Sandbox Code Playgroud)
BookType 有一个字段作者并引用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.
}
} }
})
Run Code Online (Sandbox Code Playgroud)
所以当Javascript引擎需要使用的时候BookType会看到fields.author.type是AuthorType并且AuthorType上面没有定义。所以它会给
reference error:AuthorType is not defined
Run Code Online (Sandbox Code Playgroud)
为了避免这种情况,我们将字段转换为函数。该函数是一个 CLOSURE 函数。这是为什么闭包如此有用的一个很好的例子。
当js引擎首先读取文件时,它会将函数内部引用的所有变量保存到内存堆中作为该函数的闭包存储。所有需要的变量BookType.fields都存储在 BookType.fields() 的闭包环境中。所以现在如果 javascript 执行 Booktype.fields() ,它会检查函数内是否定义了“AuthorType”,它没有定义,所以它检查它的闭包存储,AuthorType 一开始就已经存储在那里,所以它使用它。
| 归档时间: |
|
| 查看次数: |
1323 次 |
| 最近记录: |