如何理解es6中的Promise?

113 阅读2分钟

如何理解es6中的Promise?

试题解析:考查对JS中同步异步的理解,及工作中常用的使用场景 参考回答

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