@@ -4,6 +4,7 @@ layout: ../_core/DocsLayout
4
4
category : Learn
5
5
permalink : /learn/execution/
6
6
next : /learn/introspection/
7
+
7
8
---
8
9
9
10
一个 GraphQL 查询在被验证后,GraphQL 服务器会将之执行,并返回与请求的结构相对应的结果,该结果通常会是 JSON 的格式。
@@ -53,7 +54,7 @@ type Starship {
53
54
54
55
## 根字段 & 解析器
55
56
56
- 每一个 GraphQL 服务端应用的顶层,必有一个类型代表着所有进入 GraphQL API 可能的入口点,我们将它称之为 ** Root** 类型或 ** Query* * 类型。
57
+ 每一个 GraphQL 服务端应用的顶层,必有一个类型代表着所有进入 GraphQL API 可能的入口点,我们将它称之为 * Root* 类型或 * Query* 类型。
57
58
58
59
在这个例子中查询类型提供了一个字段 ` human ` ,并且接受一个参数 ` id ` 。这个字段的解析器可能请求了数据库之后通过构造函数返回一个 ` Human ` 对象。
59
60
@@ -85,7 +86,7 @@ human(obj, args, context) {
85
86
}
86
87
```
87
88
88
- ` context ` 提供了一个数据库访问对象,用来通过查询中传递的参数 ` id ` 来查询数据,因为从数据库拉取数据的过程是一个异步操作,该方法返回了一个 [ Promise] ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise ) 对象,在 JavaScript 语言中 Promise 对象用来处理异步操作,但在许多语言中存在相同的概念,通常称作 ** Futures** 、 ** Tasks** 或者 ** Defferred* * 。当数据库返回查询结果,我们就能构造并返回一个新的 ` Human ` 对象。
89
+ ` context ` 提供了一个数据库访问对象,用来通过查询中传递的参数 ` id ` 来查询数据,因为从数据库拉取数据的过程是一个异步操作,该方法返回了一个 [ Promise] ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise ) 对象,在 JavaScript 语言中 Promise 对象用来处理异步操作,但在许多语言中存在相同的概念,通常称作 * Futures* 、 * Tasks* 或者 * Defferred* 。当数据库返回查询结果,我们就能构造并返回一个新的 ` Human ` 对象。
89
90
90
91
这里要注意的是,只有解析器能感知到 Promise 的进度,GraphQL 查询只关注一个包含着 ` name ` 属性的 ` human ` 字段是否返回,在执行期间如果异步操作没有完成,则 GraphQL 会一直等待下去,因此在这个环节需要关注异步处理上的优化。
91
92
@@ -105,7 +106,7 @@ GraphQL 服务端应用的业务取决于类型系统的结构。在 `human` 对
105
106
106
107
在这个例子中,对 name 字段的处理非常的清晰,name 字段对应的解析器被调用的时候,解析器回调函数的 obj 参数是由上层回调函数生成的 ` new Human ` 对象。在这个案例中,我们希望 Human 对象会拥有一个 ` name ` 属性可以让我们直接读取。
107
108
108
- 事实上在返回的字段可以直接从对象中获得的时候 ,大部分 GraphQL 库可以让我们省略定义的步骤,当然这只适用于我们请求的字段可以直接从上层返回对象中取得并返回的情况 。
109
+ 事实上在返回的字段可以直接从对象中获得并且没有额外定义解析器的时候 ,大部分 GraphQL 库可以让我们省略定义的步骤。
109
110
110
111
## 标量强制
111
112
@@ -121,7 +122,7 @@ Human: {
121
122
122
123
请注意,我们的类型系统声明 ` appearsIn ` 字段将返回具有已知值的枚举值,但是此函数返回数字!实际上,如果我们查看结果,我们将看到正在返回适当的枚举值。这是怎么回事?
123
124
124
- 这是一个强制标量的例子。因为类型系统已经被设定,所以解析器函数的返回值必须符合与类型系统对应的API规则的约束。在这种情况下,我们在的服务器的类定义了一个应该返回枚举值解析器在内部返回了 4、5 和 6 的整数类型,但是 GraphQL 类型系统中将它们表示为枚举值。
125
+ 这是一个强制标量的例子。因为类型系统已经被设定,所以解析器函数的返回值必须符合与类型系统对应的 API 规则的约束。在这个案例中, 我们可能在服务器上定义了一个枚举类型,它在内部使用像是 4、5 和 6 这样的数字,但在 GraphQL 类型系统中将它们表示为枚举值。
125
126
126
127
## 列表解析器
127
128
@@ -145,19 +146,6 @@ GraphQL 将并发执行这些 Promise,当执行结束返回一个对象列表
145
146
146
147
## 产生结果
147
148
148
- 当每个字段被解析时,结果被放置到键值映射中,字段名称(或别名)作为键值映射的键,解析器的值作为键值映射的值,这个过程从查询字段的底部叶子节点开始返回,直到根 Query 类型的起始节点。总而言之,这些结构反映了根 Query 类型 ,然后可以将其发送(通常为 JSON 格式)到请求的客户端。
149
+ 当每个字段被解析时,结果被放置到键值映射中,字段名称(或别名)作为键值映射的键,解析器的值作为键值映射的值,这个过程从查询字段的底部叶子节点开始返回,直到根 Query 类型的起始节点。总而言之,最后合并成为能够镜像到原始查询结构的结果 ,然后可以将其发送(通常为 JSON 格式)到请求的客户端。
149
150
150
151
让我们最后一眼看看原来的查询,看看这些解析函数如何产生一个结果:
151
-
152
- ``` graphql
153
- # { "graphiql": true }
154
- {
155
- human (id : 1002 ) {
156
- name
157
- appearsIn
158
- starships {
159
- name
160
- }
161
- }
162
- }
163
- ```
0 commit comments