什么是 Promise 呢?
ES6中一个非常重要和好用的特性就是 Promise
处理异步
在封装一个网络请求的函数,如果网络请求非常复杂,就会出现回调地狱
示例

上面的代码,可以正常运行并且获取我们想要的结果,但是当每次处理传递的数据进行几百行代码,然后再进行回调。代码丑陋且不易维护。使用Promise可以优雅的解决这个问题
使用Promise写一个简单的示例
| 12
 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)
 })
 
 | 
| 12
 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 链式调用
| 12
 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('第三次')
 })
 
 | 

链式调用的另一种写法
| 12
 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行处理代码')
 })
 
 | 
简写
| 12
 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行处理代码')
 })
 
 | 
再次简写
| 12
 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
| 12
 3
 4
 5
 6
 
 | 	return Promise.reject('error message')}).catch(error=>{
 console.log(error)
 })
 
 
 
 | 
抛出异常
| 12
 3
 4
 5
 
 | 	throw 'error message'}).catch(error=>{
 console.log(error)
 })
 
 
 | 
Promise的all方法使用
| 12
 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)
 })
 
 |