什么是 Promise 呢?
ES6中一个非常重要和好用的特性就是 Promise
处理异步
在封装一个网络请求的函数,如果网络请求非常复杂,就会出现回调地狱
示例
上面的代码,可以正常运行并且获取我们想要的结果,但是当每次处理传递的数据进行几百行代码,然后再进行回调。代码丑陋且不易维护。使用Promise可以优雅的解决这个问题
使用Promise写一个简单的示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| new Promise((resolve,reject) =>{ setTimeout( () =>{ resolve('Hello World') reject('Error Data') },1000) }).then(data =>{ console.log(data) }).catch(error =>{ console.log(error) })
new Promise((resolve,reject) =>{ setTimeout( () =>{ resolve('Hello World') reject('Error Data') },1000) }).then(data =>{ console.log(data) }, err =>{ console.log(err) })
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| new Promise((resolve,reject) =>{ setTimeout( () =>{ resolve('Hello World') reject('Error Data') },1000) }).then(data =>{ console.log(date) return new Promise((resolve,reject) =>{ setTimeout( () =>{ resolve('Hello World') reject('Error Data') },1000) }) }).then()
|
Promise 三种状态
pending
等待状态,比如正在进行网络请求,或者定时器没有到时间
fulfill
满足状态,当我们主动回调了 resolve
,就处于该状态,并且会回调.then()
reject
拒绝状态,当我们主动回调了 reject
,就处于该状态,并且会回调.catch()
Promise 链式调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| new Promise((resolve,reject) =>{ setTimeout(() =>{ resolve() },1000) }).then(()=>{ console.log('第一次') return new Promise((resolve,reject) =>{ setTimeout(()=>{ resolve() },1000) }) }).then(()=>{ console.log('第二次') return new Promise((resolve,reject) =>{ setTimeout(()=>{ resolve() },1000) }) }).then(()=>{ console.log('第三次') })
|
链式调用的另一种写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
new Promise((resolve,reject) =>{ setTimeout(()=>{ resolve('aaa') },1000) }).then(res=>{ console.log(res,'第一层的10行处理代码') return new Promise((resolve)=>{ resolve(res + '111') }) }).then(res =>{ console.log(res,'第二层的10行处理代码') return new Promise((resolve)=>{ resolve(res + '222') }) }).then(res =>{ console.log(res,'第三层的10行处理代码') })
|
简写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| new Promise((resolve,reject) =>{ setTimeout(()=>{ resolve('aaa') },1000) }).then(res=>{ console.log(res,'第一层的10行处理代码') return Promise.resolve(res + '111') }) }).then(res =>{ console.log(res,'第二层的10行处理代码') return Promise.resolve(res + '222') }) }).then(res =>{ console.log(res,'第三层的10行处理代码') })
|
再次简写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| new Promise((resolve,reject) =>{ setTimeout(()=>{ resolve('aaa') },1000) }).then(res=>{ console.log(res,'第一层的10行处理代码') return res + '111' }).then(res =>{ console.log(res,'第二层的10行处理代码') return res + '222' }).then(res =>{ console.log(res,'第三层的10行处理代码') })
|
某层调用了reject
1 2 3 4 5 6
| return Promise.reject('error message') }).catch(error=>{ console.log(error) })
|
抛出异常
1 2 3 4 5
| throw 'error message' }).catch(error=>{ console.log(error) })
|
Promise的all方法使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Promise.all([ new Promise((resolve,reject) =>{ $.ajax({ url:'url1', success: function(data){ resolve(data) } }), $.ajax({ url:'url2', success: function(data){ resolve(data) } }) }) ]).then(results=>{ console.log(results) })
|