如何理解es6中的Promise?

js是单线程的,也就是说一次只能完成一个任务,为了解决这个问题,js将任务的执行模式分为两种, 同步和异步,

在es5中我们处理异步只能通过的回调的方式进行处理,在多层异步中,回调会一层一层嵌套,也就是所谓的回调地狱,

promise就是异步编程的一种解决方案

 

Promise

特点:

  • 对象的状态不受外界影响, promise对象代表一个异步操作,有三种状态pendding(进行中), fulfilled(成功), rejected(失败)

  • 一旦状态改变,就不会再变, 状态的改变只有两种可能, pendding => fulfilled及pendding => rejected

基本用法:

 

const promise = new Promise (function(resolve, reject){
        // ... some code    
     if (/* 异步操作成功 */){
          resolve(value); // 将状态从pendding变成fulfilled        
        } else {    
          reject(error); // 将状态从pendding变成rejected       
        }   
}); 

 

promise 生成实例后可以使用then方法接收resolved状态和rejected状态的回调函数

 promise.then( ()=> {
       console.log('resolved')
   }, () => {
       console.log('rejected')
   })

promise原型上具有catch方法, catch方法是rejection的别名, 用于指定发生错误时的回调函数

promise.then( ()=> {
       console.log('resolved')
   }, () => {
       console.log('rejected')
   }).catch( (err) => {
       console.log('catch')
   })

promise原型上具有finally方法,用于不管promise对象最后的状态如何,都会执行的操作

promise.then( ()=> {
       console.log('resolved')
   }, () => {
       console.log('rejected')
   }).finally( (err) => {
       console.log('end')
   })

Promise.all

Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例

简单使用:

 

const p = Promise.all([p1, p2, p3]);

特点:

  • 参数都是promise实例,如果不是会调用promise.resolve方法将其转为promise实例

  • p的奖态由传入的promise实例的状态决定

    • promise实例状态都变成fulfilled,p状态为fulfilled

    • promise实例状态一个变成rejected,p状态为rejected  

posted @ 2019-07-16 17:02  Mr_Javen  阅读(449)  评论(0编辑  收藏  举报