1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

修改promise/catch

This commit is contained in:
Ruan Yifeng 2015-02-17 08:55:52 +08:00
parent 0f6ed36b02
commit 1f3489eab8

View File

@ -143,6 +143,37 @@ getJSON("/posts.json").then(function(posts) {
上面代码中getJSON方法返回一个Promise对象如果该对象运行正常则会调用then方法指定的回调函数如果该方法抛出错误则会调用catch方法指定的回调函数处理这个错误。
下面是一个例子。
```javascript
var promise = new Promise(function(resolve, reject) {
throw new Error('test')
});
promise.catch(function(error) { console.log(error) });
// Error: test
```
上面代码中Promise抛出一个错误就被catch方法指定的回调函数捕获。
如果Promise状态已经变成“已完成”再抛出错误是无效的。
```javascript
var promise = new Promise(function(resolve, reject) {
resolve("ok");
throw new Error('test');
});
promise
.then(function(value) { console.log(value) })
.catch(function(error) { console.log(error) });
// ok
```
上面代码中Promise在resolve语句后面再抛出错误不会被捕获等于没有抛出。
Promise对象的错误具有“冒泡”性质会一直向后传递直到被捕获为止。也就是说错误总是会被下一个catch语句捕获。
```javascript
@ -178,6 +209,20 @@ someAsyncThing().then(function() {
上面代码中someAsyncThing函数产生的Promise对象会报错但是由于没有调用catch方法这个错误不会被捕获也不会传递到外层代码导致运行后没有任何输出。
```javascript
var promise = new Promise(function(resolve, reject) {
resolve("ok");
setTimeout(function() { throw new Error('test') }, 0)
});
promise.then(function(value) { console.log(value) });
// ok
// Uncaught Error: test
```
上面代码中Promise指定在下一轮“事件循环”再抛出错误结果由于没有指定catch语句就冒泡到最外层成了未捕获的错误。
需要注意的是catch方法返回的还是一个Promise对象因此后面还可以接着调用then方法。
```javascript