mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-24 18:32:22 +00:00
docs(Promise): edit Promise
This commit is contained in:
parent
c49aac143b
commit
71eab1206c
@ -14,7 +14,7 @@ var fs = require('fs');
|
|||||||
var readFile = function (fileName) {
|
var readFile = function (fileName) {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
fs.readFile(fileName, function(error, data) {
|
fs.readFile(fileName, function(error, data) {
|
||||||
if (error) reject(error);
|
if (error) return reject(error);
|
||||||
resolve(data);
|
resolve(data);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Promise 的含义
|
## Promise 的含义
|
||||||
|
|
||||||
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了`Promise`对象。
|
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了`Promise`对象。
|
||||||
|
|
||||||
所谓`Promise`,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
|
所谓`Promise`,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ getJSON("/posts.json").then(function(json) {
|
|||||||
|
|
||||||
上面代码中,`getJSON`是对 XMLHttpRequest 对象的封装,用于发出一个针对 JSON 数据的 HTTP 请求,并且返回一个`Promise`对象。需要注意的是,在`getJSON`内部,`resolve`函数和`reject`函数调用时,都带有参数。
|
上面代码中,`getJSON`是对 XMLHttpRequest 对象的封装,用于发出一个针对 JSON 数据的 HTTP 请求,并且返回一个`Promise`对象。需要注意的是,在`getJSON`内部,`resolve`函数和`reject`函数调用时,都带有参数。
|
||||||
|
|
||||||
如果调用`resolve`函数和`reject`函数时带有参数,那么它们的参数会被传递给回调函数。`reject`函数的参数通常是`Error`对象的实例,表示抛出的错误;`resolve`函数的参数除了正常的值以外,还可能是另一个 Promise 实例,表示异步操作的结果有可能是一个值,也有可能是另一个异步操作,比如像下面这样。
|
如果调用`resolve`函数和`reject`函数时带有参数,那么它们的参数会被传递给回调函数。`reject`函数的参数通常是`Error`对象的实例,表示抛出的错误;`resolve`函数的参数除了正常的值以外,还可能是另一个 Promise 实例,比如像下面这样。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var p1 = new Promise(function (resolve, reject) {
|
var p1 = new Promise(function (resolve, reject) {
|
||||||
@ -160,7 +160,7 @@ var p2 = new Promise(function (resolve, reject) {
|
|||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,`p1`和`p2`都是Promise的实例,但是`p2`的`resolve`方法将`p1`作为参数,即一个异步操作的结果是返回另一个异步操作。
|
上面代码中,`p1`和`p2`都是 Promise 的实例,但是`p2`的`resolve`方法将`p1`作为参数,即一个异步操作的结果是返回另一个异步操作。
|
||||||
|
|
||||||
注意,这时`p1`的状态就会传递给`p2`,也就是说,`p1`的状态决定了`p2`的状态。如果`p1`的状态是`Pending`,那么`p2`的回调函数就会等待`p1`的状态改变;如果`p1`的状态已经是`Resolved`或者`Rejected`,那么`p2`的回调函数将会立刻执行。
|
注意,这时`p1`的状态就会传递给`p2`,也就是说,`p1`的状态决定了`p2`的状态。如果`p1`的状态是`Pending`,那么`p2`的回调函数就会等待`p1`的状态改变;如果`p1`的状态已经是`Resolved`或者`Rejected`,那么`p2`的回调函数将会立刻执行。
|
||||||
|
|
||||||
@ -181,6 +181,31 @@ p2
|
|||||||
|
|
||||||
上面代码中,`p1`是一个Promise,3秒之后变为`rejected`。`p2`的状态在1秒之后改变,`resolve`方法返回的是`p1`。由于`p2`返回的是另一个 Promise,导致`p2`自己的状态无效了,由`p1`的状态决定`p2`的状态。所以,后面的`then`语句都变成针对后者(`p1`)。又过了2秒,`p1`变为`rejected`,导致触发`catch`方法指定的回调函数。
|
上面代码中,`p1`是一个Promise,3秒之后变为`rejected`。`p2`的状态在1秒之后改变,`resolve`方法返回的是`p1`。由于`p2`返回的是另一个 Promise,导致`p2`自己的状态无效了,由`p1`的状态决定`p2`的状态。所以,后面的`then`语句都变成针对后者(`p1`)。又过了2秒,`p1`变为`rejected`,导致触发`catch`方法指定的回调函数。
|
||||||
|
|
||||||
|
注意,调用`resolve`或`reject`并不会终结 Promise 的参数函数的执行。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
resolve(1);
|
||||||
|
console.log(2);
|
||||||
|
}).then(r => {
|
||||||
|
console.log(r);
|
||||||
|
});
|
||||||
|
// 2
|
||||||
|
// 1
|
||||||
|
```
|
||||||
|
|
||||||
|
上面代码中,调用`resolve(1)`以后,后面的`console.log(2)`还是会执行,并且会首先打印出来。这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。
|
||||||
|
|
||||||
|
一般来说,调用`resolve`或`reject`以后,Promise 的使命就完成了,后继操作应该放到`then`方法里面,而不应该直接写在`resolve`或`reject`的后面。所以,最好在它们前面加上`return`语句,这样就不会有意外。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
return resolve(1);
|
||||||
|
// 后面的语句不会执行
|
||||||
|
console.log(2);
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
## Promise.prototype.then()
|
## Promise.prototype.then()
|
||||||
|
|
||||||
Promise 实例具有`then`方法,也就是说,`then`方法是定义在原型对象`Promise.prototype`上的。它的作用是为 Promise 实例添加状态改变时的回调函数。前面说过,`then`方法的第一个参数是`Resolved`状态的回调函数,第二个参数(可选)是`Rejected`状态的回调函数。
|
Promise 实例具有`then`方法,也就是说,`then`方法是定义在原型对象`Promise.prototype`上的。它的作用是为 Promise 实例添加状态改变时的回调函数。前面说过,`then`方法的第一个参数是`Resolved`状态的回调函数,第二个参数(可选)是`Rejected`状态的回调函数。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user