2
2
3
3
## Promise 的含义
4
4
5
- Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准 ,统一了用法,原生提供了` Promise ` 对象。
5
+ Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准 ,统一了用法,原生提供了` Promise ` 对象。
6
6
7
7
所谓` Promise ` ,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
8
8
@@ -147,7 +147,7 @@ getJSON("/posts.json").then(function(json) {
147
147
148
148
上面代码中,` getJSON ` 是对 XMLHttpRequest 对象的封装,用于发出一个针对 JSON 数据的 HTTP 请求,并且返回一个` Promise ` 对象。需要注意的是,在` getJSON ` 内部,` resolve ` 函数和` reject ` 函数调用时,都带有参数。
149
149
150
- 如果调用` resolve ` 函数和` reject ` 函数时带有参数,那么它们的参数会被传递给回调函数。` reject ` 函数的参数通常是` Error ` 对象的实例,表示抛出的错误;` resolve ` 函数的参数除了正常的值以外,还可能是另一个 Promise 实例,表示异步操作的结果有可能是一个值,也有可能是另一个异步操作, 比如像下面这样。
150
+ 如果调用` resolve ` 函数和` reject ` 函数时带有参数,那么它们的参数会被传递给回调函数。` reject ` 函数的参数通常是` Error ` 对象的实例,表示抛出的错误;` resolve ` 函数的参数除了正常的值以外,还可能是另一个 Promise 实例,比如像下面这样。
151
151
152
152
``` javascript
153
153
var p1 = new Promise (function (resolve , reject ) {
@@ -160,7 +160,7 @@ var p2 = new Promise(function (resolve, reject) {
160
160
})
161
161
```
162
162
163
- 上面代码中,` p1 ` 和` p2 ` 都是Promise的实例 ,但是` p2 ` 的` resolve ` 方法将` p1 ` 作为参数,即一个异步操作的结果是返回另一个异步操作。
163
+ 上面代码中,` p1 ` 和` p2 ` 都是 Promise 的实例 ,但是` p2 ` 的` resolve ` 方法将` p1 ` 作为参数,即一个异步操作的结果是返回另一个异步操作。
164
164
165
165
注意,这时` p1 ` 的状态就会传递给` p2 ` ,也就是说,` p1 ` 的状态决定了` p2 ` 的状态。如果` p1 ` 的状态是` Pending ` ,那么` p2 ` 的回调函数就会等待` p1 ` 的状态改变;如果` p1 ` 的状态已经是` Resolved ` 或者` Rejected ` ,那么` p2 ` 的回调函数将会立刻执行。
166
166
181
181
182
182
上面代码中,` p1 ` 是一个Promise,3秒之后变为` rejected ` 。` p2 ` 的状态在1秒之后改变,` resolve ` 方法返回的是` p1 ` 。由于` p2 ` 返回的是另一个 Promise,导致` p2 ` 自己的状态无效了,由` p1 ` 的状态决定` p2 ` 的状态。所以,后面的` then ` 语句都变成针对后者(` p1 ` )。又过了2秒,` p1 ` 变为` rejected ` ,导致触发` catch ` 方法指定的回调函数。
183
183
184
+ 注意,调用` resolve ` 或` reject ` 并不会终结 Promise 的参数函数的执行。
185
+
186
+ ``` javascript
187
+ new Promise ((resolve , reject ) => {
188
+ resolve (1 );
189
+ console .log (2 );
190
+ }).then (r => {
191
+ console .log (r);
192
+ });
193
+ // 2
194
+ // 1
195
+ ```
196
+
197
+ 上面代码中,调用` resolve(1) ` 以后,后面的` console.log(2) ` 还是会执行,并且会首先打印出来。这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。
198
+
199
+ 一般来说,调用` resolve ` 或` reject ` 以后,Promise 的使命就完成了,后继操作应该放到` then ` 方法里面,而不应该直接写在` resolve ` 或` reject ` 的后面。所以,最好在它们前面加上` return ` 语句,这样就不会有意外。
200
+
201
+ ``` javascript
202
+ new Promise ((resolve , reject ) => {
203
+ return resolve (1 );
204
+ // 后面的语句不会执行
205
+ console .log (2 );
206
+ })
207
+ ```
208
+
184
209
## Promise.prototype.then()
185
210
186
211
Promise 实例具有` then ` 方法,也就是说,` then ` 方法是定义在原型对象` Promise.prototype ` 上的。它的作用是为 Promise 实例添加状态改变时的回调函数。前面说过,` then ` 方法的第一个参数是` Resolved ` 状态的回调函数,第二个参数(可选)是` Rejected ` 状态的回调函数。
0 commit comments