@@ -16,13 +16,13 @@ Promise 是异步编程的一种解决方案,比传统的解决方案——回
16
16
17
17
` Promise ` 也有一些缺点。首先,无法取消` Promise ` ,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,` Promise ` 内部抛出的错误,不会反应到外部。第三,当处于` Pending ` 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
18
18
19
- 如果某些事件不断地反复发生,一般来说,使用 stream 模式是比部署` Promise ` 更好的选择。
19
+ 如果某些事件不断地反复发生,一般来说,使用 [ Stream ] ( https://nodejs.org/api/ stream.html ) 模式是比部署` Promise ` 更好的选择。
20
20
21
21
## 基本用法
22
22
23
- ES6规定,Promise对象是一个构造函数,用来生成Promise实例 。
23
+ ES6 规定, ` Promise ` 对象是一个构造函数,用来生成 ` Promise ` 实例 。
24
24
25
- 下面代码创造了一个Promise实例 。
25
+ 下面代码创造了一个 ` Promise ` 实例 。
26
26
27
27
``` javascript
28
28
var promise = new Promise (function (resolve , reject ) {
@@ -36,11 +36,11 @@ var promise = new Promise(function(resolve, reject) {
36
36
});
37
37
```
38
38
39
- Promise构造函数接受一个函数作为参数 ,该函数的两个参数分别是` resolve ` 和` reject ` 。它们是两个函数,由JavaScript引擎提供 ,不用自己部署。
39
+ ` Promise ` 构造函数接受一个函数作为参数 ,该函数的两个参数分别是` resolve ` 和` reject ` 。它们是两个函数,由 JavaScript 引擎提供 ,不用自己部署。
40
40
41
- ` resolve ` 函数的作用是,将Promise对象的状态从 “未完成”变为“成功”(即从Pending变为Resolved ),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;` reject ` 函数的作用是,将Promise对象的状态从 “未完成”变为“失败”(即从Pending变为Rejected ),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
41
+ ` resolve ` 函数的作用是,将 ` Promise ` 对象的状态从 “未完成”变为“成功”(即从 Pending 变为 Resolved ),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;` reject ` 函数的作用是,将 ` Promise ` 对象的状态从 “未完成”变为“失败”(即从 Pending 变为 Rejected ),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
42
42
43
- Promise实例生成以后 ,可以用` then ` 方法分别指定` Resolved ` 状态和` Reject ` 状态的回调函数。
43
+ ` Promise ` 实例生成以后 ,可以用` then ` 方法分别指定` Resolved ` 状态和` Reject ` 状态的回调函数。
44
44
45
45
``` javascript
46
46
promise .then (function (value ) {
@@ -50,9 +50,9 @@ promise.then(function(value) {
50
50
});
51
51
```
52
52
53
- ` then ` 方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为Resolved时调用,第二个回调函数是Promise对象的状态变为Reject时调用 。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数 。
53
+ ` then ` 方法可以接受两个回调函数作为参数。第一个回调函数是 ` Promise ` 对象的状态变为 ` Resolved ` 时调用,第二个回调函数是 ` Promise ` 对象的状态变为 ` Rejected ` 时调用 。其中,第二个函数是可选的,不一定要提供。这两个函数都接受 ` Promise ` 对象传出的值作为参数 。
54
54
55
- 下面是一个Promise对象的简单例子 。
55
+ 下面是一个 ` Promise ` 对象的简单例子 。
56
56
57
57
``` javascript
58
58
function timeout (ms ) {
@@ -66,9 +66,9 @@ timeout(100).then((value) => {
66
66
});
67
67
```
68
68
69
- 上面代码中,` timeout ` 方法返回一个Promise实例 ,表示一段时间以后才会发生的结果。过了指定的时间(` ms ` 参数)以后,Promise实例的状态变为Resolved ,就会触发` then ` 方法绑定的回调函数。
69
+ 上面代码中,` timeout ` 方法返回一个 ` Promise ` 实例 ,表示一段时间以后才会发生的结果。过了指定的时间(` ms ` 参数)以后,` Promise ` 实例的状态变为 ` Resolved ` ,就会触发` then ` 方法绑定的回调函数。
70
70
71
- Promise新建后就会立即执行 。
71
+ Promise 新建后就会立即执行 。
72
72
73
73
``` javascript
74
74
let promise = new Promise (function (resolve , reject ) {
@@ -87,7 +87,7 @@ console.log('Hi!');
87
87
// Resolved
88
88
```
89
89
90
- 上面代码中,Promise新建后立即执行 ,所以首先输出的是“ Promise” 。然后,` then ` 方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以“ Resolved” 最后输出。
90
+ 上面代码中,Promise 新建后立即执行 ,所以首先输出的是` Promise ` 。然后,` then ` 方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以` Resolved ` 最后输出。
91
91
92
92
下面是异步加载图片的例子。
93
93
@@ -109,9 +109,9 @@ function loadImageAsync(url) {
109
109
}
110
110
```
111
111
112
- 上面代码中,使用Promise包装了一个图片加载的异步操作 。如果加载成功,就调用` resolve ` 方法,否则就调用` reject ` 方法。
112
+ 上面代码中,使用 ` Promise ` 包装了一个图片加载的异步操作 。如果加载成功,就调用` resolve ` 方法,否则就调用` reject ` 方法。
113
113
114
- 下面是一个用Promise对象实现的Ajax操作的例子 。
114
+ 下面是一个用 ` Promise ` 对象实现的 Ajax 操作的例子 。
115
115
116
116
``` javascript
117
117
var getJSON = function (url ) {
@@ -145,9 +145,9 @@ getJSON("/posts.json").then(function(json) {
145
145
});
146
146
```
147
147
148
- 上面代码中,` getJSON ` 是对XMLHttpRequest对象的封装,用于发出一个针对JSON数据的HTTP请求,并且返回一个Promise对象 。需要注意的是,在` getJSON ` 内部,` resolve ` 函数和` reject ` 函数调用时,都带有参数。
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 ) {
183
183
184
184
## Promise.prototype.then()
185
185
186
- Promise实例具有 ` then ` 方法,也就是说,` then ` 方法是定义在原型对象Promise.prototype上的。它的作用是为Promise实例添加状态改变时的回调函数 。前面说过,` then ` 方法的第一个参数是Resolved状态的回调函数 ,第二个参数(可选)是Rejected状态的回调函数 。
186
+ Promise 实例具有 ` then ` 方法,也就是说,` then ` 方法是定义在原型对象 ` Promise.prototype ` 上的。它的作用是为 Promise 实例添加状态改变时的回调函数 。前面说过,` then ` 方法的第一个参数是 ` Resolved ` 状态的回调函数 ,第二个参数(可选)是 ` Rejected ` 状态的回调函数 。
187
187
188
- ` then ` 方法返回的是一个新的Promise实例 (注意,不是原来那个Promise实例 )。因此可以采用链式写法,即` then ` 方法后面再调用另一个` then ` 方法。
188
+ ` then ` 方法返回的是一个新的 ` Promise ` 实例 (注意,不是原来那个 ` Promise ` 实例 )。因此可以采用链式写法,即` then ` 方法后面再调用另一个` then ` 方法。
189
189
190
190
``` javascript
191
191
getJSON (" /posts.json" ).then (function (json ) {
@@ -197,7 +197,7 @@ getJSON("/posts.json").then(function(json) {
197
197
198
198
上面的代码使用` then ` 方法,依次指定了两个回调函数。第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。
199
199
200
- 采用链式的` then ` ,可以指定一组按照次序调用的回调函数。这时,前一个回调函数,有可能返回的还是一个Promise对象 (即有异步操作),这时后一个回调函数,就会等待该Promise对象的状态发生变化 ,才会被调用。
200
+ 采用链式的` then ` ,可以指定一组按照次序调用的回调函数。这时,前一个回调函数,有可能返回的还是一个 ` Promise ` 对象 (即有异步操作),这时后一个回调函数,就会等待该 ` Promise ` 对象的状态发生变化 ,才会被调用。
201
201
202
202
``` javascript
203
203
getJSON (" /post/1.json" ).then (function (post ) {
@@ -209,7 +209,7 @@ getJSON("/post/1.json").then(function(post) {
209
209
});
210
210
```
211
211
212
- 上面代码中,第一个` then ` 方法指定的回调函数,返回的是另一个Promise对象 。这时,第二个` then ` 方法指定的回调函数,就会等待这个新的Promise对象状态发生变化。如果变为Resolved ,就调用` funcA ` ,如果状态变为Rejected ,就调用` funcB ` 。
212
+ 上面代码中,第一个` then ` 方法指定的回调函数,返回的是另一个 ` Promise ` 对象 。这时,第二个` then ` 方法指定的回调函数,就会等待这个新的 ` Promise ` 对象状态发生变化。如果变为 ` Resolved ` ,就调用` funcA ` ,如果状态变为 ` Rejected ` ,就调用` funcB ` 。
213
213
214
214
如果采用箭头函数,上面的代码可以写得更简洁。
215
215
0 commit comments