Skip to content

Commit

Permalink
over Promise
Browse files Browse the repository at this point in the history
  • Loading branch information
ccforward committed Aug 7, 2016
1 parent 683e020 commit 5822184
Showing 1 changed file with 164 additions and 1 deletion.
165 changes: 164 additions & 1 deletion Blog/34.ES6 笔记三-Promise.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,167 @@ var getJSON = function(url){
then 方法是为 Promise 实例添加状态改变时的回调函数。then方法的第一个参数是 Resolved 状态的回调函数,第二个参数(可选)是 Rejected 状态的回调函数。
then方法返回的是一个新的Promise实例(不是原来那个),可采用链式写法。
then方法返回的是一个新的Promise实例(不是原来那个),可采用链式写法。如下:
```js
getJSON("a.json").then(function(res){
return getJSON(res.dataURL)
}).then(function fnA(data){
console.log('Resolved: ' + data);
}, function fnB(err){
console.log('Rejected: ' + err);
});
```
第一个then方法指定的回调函数返回的是一个新的 Promise 对象。这时,第二个then方法指定的回调函数就等待这个新的 Promise 对象发生变化来调用A或B函数
上面的代码改为箭头函数更简洁:
```js
getJSON("a.json").then(
res => getJSON(res.dataURL)
).then(
data => console.log('Resolved: ' + data),
err => console.log('Rejected: ' + err)
);
```
## Promise.prototype.catch
Promise.prototype.catch 是 .then(null, rejection) 的别名。
如果异步操作抛出错误,状态就会变为 Rejected, 就会调用catch方法指定的回调函数处理这个错误。
一般来说,不要再then方法中定义 Rejected 状态的回调函数(then的第二个参数),而应该总是使用 catch 方法。
```js
//bad
promise
.then(function(data){
// success
},function(err){
// error
})

// good
promise
.then(function(data){ //回调函数
// success
})
.catch(function(err){
// error
})
```
跟传统的 try/catch 不同,如果没有使用catch方法指定错误处理的回调函数, Promise对象抛出的错误不会传递到外层代码,即不会有任何反应。
catch 返回的还是一个 Promise 对象,因此后面可以继续调用 then 方法。
```js
var someAsync = function(){
return new Promise(function(resolve, reject){
// x没声明 报错
resolve(x+2);
});
}

comAsync()
.catch(function(err){
console.log('error: ' + err)
})
.then(function(){
console.log('go on')
});

// error: [ReferenceError: x is not defined]
// go on 接着运行then方法
```
## Promise.all()
Promise.all 用于将多个 Promise 实例包装成一个新的 Promise 实例。
```js
var p = Promise.all([p1, p2, p3]);
```
p的状态由 p1 p2 p3 决定
1. 只有 p1 p2 p3 都为 Fullfilled p的状态才会是 Fullfilled。p1 p2 p3的返回值组成一个数组传递给p的回调函数。
2. 如果 p1 p2 p3 有一个为 Rejected 则 p 的状态为 Rejected。此时第一个被 Rejected 的实例的返回值会传递给p的回调函数。
## Promise.race()
Promise.race 也是将多个 Promise 实例包装成一个新的 Promise 实例。
```js
var p = Promise.race([p1, p2, p3]);
```
只要 p1 p2 p3 中有一个实例率先改变状态,p的状态就跟着改变
```js
var p = Promise.race([
fetch('/data.json'),
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), 5000)
})
])
p.then(response => console.log(response))
p.catch(error => console.log(error))
```
如果5秒之内fetch方法无法返回结果,变量p的状态就会变为rejected,从而触发catch方法指定的回调函数。
## Promise.resolve()
Promise.resolve方法将现有对象转为Promise对象。
`Promise.resolve($.ajax('/whatever.json'));`
把 jQuery 生成的 deferred 对象转为新的 Promise 对象
```js
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
```
如果resolve方法的参数是一个不具有then方法的对象,则Promise.resolve方法返回一个新的Promise对象,状态为Resolved。
```js
var p = Promise.resolve('Hello');

p.then(function (s){
console.log(s)
});
```
字符串Hello不属于异步操作(判断方法是它不是具有then方法的对象),返回Promise实例的状态从一生成就是Resolved,所以回调函数会立即执行。
Promise.resolve方法允许调用时不带参数,直接调用Promise.resolve可以获得一个 Promise 对象。
```js
var p = Promise.resolve();

p.then(function () {
// ...
});
```
## Promise.reject()
Promise.reject() 方法也会返回一个新的Promise实例,且状态为rejected。
它的参数用法与Promise.resolve方法完全一致。
```js
var p = Promise.reject('出错了');
// 等同于
var p = new Promise((resolve, reject) => reject('出错了'))

p.then(null, function (s){
console.log(s)
});
// 出错了
```

0 comments on commit 5822184

Please sign in to comment.