mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-24 18:32:22 +00:00
docs: edit Promise
This commit is contained in:
parent
0849a77220
commit
ac50325b6e
@ -251,7 +251,7 @@ getJSON("/post/1.json").then(
|
|||||||
|
|
||||||
## Promise.prototype.catch()
|
## Promise.prototype.catch()
|
||||||
|
|
||||||
`Promise.prototype.catch`方法是`.then(null, rejection)`或`.then(undefined, rejection)`的别名,用于指定发生错误时的回调函数。
|
`Promise.prototype.catch()`方法是`.then(null, rejection)`或`.then(undefined, rejection)`的别名,用于指定发生错误时的回调函数。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
getJSON('/posts.json').then(function(posts) {
|
getJSON('/posts.json').then(function(posts) {
|
||||||
@ -262,7 +262,7 @@ getJSON('/posts.json').then(function(posts) {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,`getJSON`方法返回一个 Promise 对象,如果该对象状态变为`resolved`,则会调用`then`方法指定的回调函数;如果异步操作抛出错误,状态就会变为`rejected`,就会调用`catch`方法指定的回调函数,处理这个错误。另外,`then`方法指定的回调函数,如果运行中抛出错误,也会被`catch`方法捕获。
|
上面代码中,`getJSON()`方法返回一个 Promise 对象,如果该对象状态变为`resolved`,则会调用`then()`方法指定的回调函数;如果异步操作抛出错误,状态就会变为`rejected`,就会调用`catch()`方法指定的回调函数,处理这个错误。另外,`then()`方法指定的回调函数,如果运行中抛出错误,也会被`catch()`方法捕获。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
p.then((val) => console.log('fulfilled:', val))
|
p.then((val) => console.log('fulfilled:', val))
|
||||||
@ -285,7 +285,7 @@ promise.catch(function(error) {
|
|||||||
// Error: test
|
// Error: test
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,`promise`抛出一个错误,就被`catch`方法指定的回调函数捕获。注意,上面的写法与下面两种写法是等价的。
|
上面代码中,`promise`抛出一个错误,就被`catch()`方法指定的回调函数捕获。注意,上面的写法与下面两种写法是等价的。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// 写法一
|
// 写法一
|
||||||
@ -309,7 +309,7 @@ promise.catch(function(error) {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
比较上面两种写法,可以发现`reject`方法的作用,等同于抛出错误。
|
比较上面两种写法,可以发现`reject()`方法的作用,等同于抛出错误。
|
||||||
|
|
||||||
如果 Promise 状态已经变成`resolved`,再抛出错误是无效的。
|
如果 Promise 状态已经变成`resolved`,再抛出错误是无效的。
|
||||||
|
|
||||||
@ -338,9 +338,9 @@ getJSON('/post/1.json').then(function(post) {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,一共有三个 Promise 对象:一个由`getJSON`产生,两个由`then`产生。它们之中任何一个抛出的错误,都会被最后一个`catch`捕获。
|
上面代码中,一共有三个 Promise 对象:一个由`getJSON()`产生,两个由`then()`产生。它们之中任何一个抛出的错误,都会被最后一个`catch()`捕获。
|
||||||
|
|
||||||
一般来说,不要在`then`方法里面定义 Reject 状态的回调函数(即`then`的第二个参数),总是使用`catch`方法。
|
一般来说,不要在`then()`方法里面定义 Reject 状态的回调函数(即`then`的第二个参数),总是使用`catch`方法。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// bad
|
// bad
|
||||||
@ -361,9 +361,9 @@ promise
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,第二种写法要好于第一种写法,理由是第二种写法可以捕获前面`then`方法执行中的错误,也更接近同步的写法(`try/catch`)。因此,建议总是使用`catch`方法,而不使用`then`方法的第二个参数。
|
上面代码中,第二种写法要好于第一种写法,理由是第二种写法可以捕获前面`then`方法执行中的错误,也更接近同步的写法(`try/catch`)。因此,建议总是使用`catch()`方法,而不使用`then()`方法的第二个参数。
|
||||||
|
|
||||||
跟传统的`try/catch`代码块不同的是,如果没有使用`catch`方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。
|
跟传统的`try/catch`代码块不同的是,如果没有使用`catch()`方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const someAsyncThing = function() {
|
const someAsyncThing = function() {
|
||||||
@ -382,9 +382,9 @@ setTimeout(() => { console.log(123) }, 2000);
|
|||||||
// 123
|
// 123
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,`someAsyncThing`函数产生的 Promise 对象,内部有语法错误。浏览器运行到这一行,会打印出错误提示`ReferenceError: x is not defined`,但是不会退出进程、终止脚本执行,2 秒之后还是会输出`123`。这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。
|
上面代码中,`someAsyncThing()`函数产生的 Promise 对象,内部有语法错误。浏览器运行到这一行,会打印出错误提示`ReferenceError: x is not defined`,但是不会退出进程、终止脚本执行,2 秒之后还是会输出`123`。这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。
|
||||||
|
|
||||||
这个脚本放在服务器执行,退出码就是`0`(即表示执行成功)。不过,Node 有一个`unhandledRejection`事件,专门监听未捕获的`reject`错误,上面的脚本会触发这个事件的监听函数,可以在监听函数里面抛出错误。
|
这个脚本放在服务器执行,退出码就是`0`(即表示执行成功)。不过,Node.js 有一个`unhandledRejection`事件,专门监听未捕获的`reject`错误,上面的脚本会触发这个事件的监听函数,可以在监听函数里面抛出错误。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
process.on('unhandledRejection', function (err, p) {
|
process.on('unhandledRejection', function (err, p) {
|
||||||
@ -410,7 +410,7 @@ promise.then(function (value) { console.log(value) });
|
|||||||
|
|
||||||
上面代码中,Promise 指定在下一轮“事件循环”再抛出错误。到了那个时候,Promise 的运行已经结束了,所以这个错误是在 Promise 函数体外抛出的,会冒泡到最外层,成了未捕获的错误。
|
上面代码中,Promise 指定在下一轮“事件循环”再抛出错误。到了那个时候,Promise 的运行已经结束了,所以这个错误是在 Promise 函数体外抛出的,会冒泡到最外层,成了未捕获的错误。
|
||||||
|
|
||||||
一般总是建议,Promise 对象后面要跟`catch`方法,这样可以处理 Promise 内部发生的错误。`catch`方法返回的还是一个 Promise 对象,因此后面还可以接着调用`then`方法。
|
一般总是建议,Promise 对象后面要跟`catch()`方法,这样可以处理 Promise 内部发生的错误。`catch()`方法返回的还是一个 Promise 对象,因此后面还可以接着调用`then()`方法。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const someAsyncThing = function() {
|
const someAsyncThing = function() {
|
||||||
@ -431,7 +431,7 @@ someAsyncThing()
|
|||||||
// carry on
|
// carry on
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码运行完`catch`方法指定的回调函数,会接着运行后面那个`then`方法指定的回调函数。如果没有报错,则会跳过`catch`方法。
|
上面代码运行完`catch()`方法指定的回调函数,会接着运行后面那个`then()`方法指定的回调函数。如果没有报错,则会跳过`catch()`方法。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
Promise.resolve()
|
Promise.resolve()
|
||||||
@ -444,9 +444,9 @@ Promise.resolve()
|
|||||||
// carry on
|
// carry on
|
||||||
```
|
```
|
||||||
|
|
||||||
上面的代码因为没有报错,跳过了`catch`方法,直接执行后面的`then`方法。此时,要是`then`方法里面报错,就与前面的`catch`无关了。
|
上面的代码因为没有报错,跳过了`catch()`方法,直接执行后面的`then()`方法。此时,要是`then()`方法里面报错,就与前面的`catch()`无关了。
|
||||||
|
|
||||||
`catch`方法之中,还能再抛出错误。
|
`catch()`方法之中,还能再抛出错误。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const someAsyncThing = function() {
|
const someAsyncThing = function() {
|
||||||
@ -468,7 +468,7 @@ someAsyncThing().then(function() {
|
|||||||
// oh no [ReferenceError: x is not defined]
|
// oh no [ReferenceError: x is not defined]
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,`catch`方法抛出一个错误,因为后面没有别的`catch`方法了,导致这个错误不会被捕获,也不会传递到外层。如果改写一下,结果就不一样了。
|
上面代码中,`catch()`方法抛出一个错误,因为后面没有别的`catch()`方法了,导致这个错误不会被捕获,也不会传递到外层。如果改写一下,结果就不一样了。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
someAsyncThing().then(function() {
|
someAsyncThing().then(function() {
|
||||||
@ -484,11 +484,11 @@ someAsyncThing().then(function() {
|
|||||||
// carry on [ReferenceError: y is not defined]
|
// carry on [ReferenceError: y is not defined]
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,第二个`catch`方法用来捕获前一个`catch`方法抛出的错误。
|
上面代码中,第二个`catch()`方法用来捕获前一个`catch()`方法抛出的错误。
|
||||||
|
|
||||||
## Promise.prototype.finally()
|
## Promise.prototype.finally()
|
||||||
|
|
||||||
`finally`方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。
|
`finally()`方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
promise
|
promise
|
||||||
|
Loading…
x
Reference in New Issue
Block a user