ES6中Promise对象详解 | 面试必考知识点

275 阅读3分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

前言

promise对象是es6中新增的,用来解决回调地狱的问题,可以实现把异步的操作用同步的形式实现,这样做更符合人们看代码的习惯,而不用在回调中一层一层的去找代码运行到了哪里。

promise的三种状态

  • Fulfilled:成功状态
  • Rejected:失败状态
  • Pending:成功和失败之外的状态,可以理解为promise对象实例创建时候的初始状态

promise的两个方法

  • resolve:使promise状态改变为成功,同时传递一个参数用于后续成功后的操作
  • reject:使promise状态改变为失败,同时将错误信息传递给后续失败后的操作

为什么要用promise

故事背景 北方的豆腐大家应该都吃过,但豆腐的制作过程大家知道吗,一块豆腐的产生要经过好多的步骤,包括种豆子,打碎豆子,加热打碎了的豆子,过滤,沉淀,压制等等,我们这里就不细说,我们就假设有三步。

  1. 豆子成熟
  2. 豆子制豆粉
  3. 豆粉制成豆腐

代码如下:

//种大豆
function fun1(){
    setTimeout(function() {
        console.log('豆子成熟了')
    },3000)
}
//大豆磨成豆粉
function fun2(){
    setTimeout(function(){
        console.log('豆粉制作成功了')
    },2000)
}
//豆粉制作豆腐
function fun3(){
    console.log('豆腐做好了')
}
fun1()
fun2()
fun3()

运行结果如下:

豆腐.PNG 咦,这是怎么回事,怎么和我想要的结果不一样呢。这里就牵扯到了js中异步事件的处理,js中异步事件会在同步事件都执行完再执行,由于种豆子和制作豆粉都是异步事件,那么结果自然就会出现问题了。如果想要正确的执行结果可以用回调函数来解决,回调函数请这里,我们这里用promise对象来解决这个问题。下面我们对代码进行改造

//种大豆
function fun1(){
    //首先,我们要声明并return一个promise对象实例,然后执行resolve(),接着我们就可以进行.then()操作了
    return new Promise(function(resolve,reject){
        setTimeout(function() {
            console.log('豆子成熟了')
            resolve()
        },3000)
    })
}
//大豆磨成豆粉
function fun2(){
    //这里也需要声明并return一个promise对象实例,因为只有promise对象的情况下,.then()操作才会再运行resolve()之后运行,否则.then()操作会立即执行,那得到的结果就又和我们想要的不一样了
    return new Promise(function(resolve,reject){ 
        setTimeout(function(){
            console.log('豆粉制作成功了')
            resolve()
        },2000)
    })
}
//豆粉制作豆腐
function fun3(){
    console.log('豆腐做好了')
}
fun1().then(function(){
        return fun2() //这里为什么要用return呢?因为只有返回值是promise对象的时候.then()操作才会等待,如果不加.then()就出现豆腐先做好才豆粉制作成功的情况
    }).then(function(){
        fun3()
})

这样我们就实现了一块豆腐完整的制作过程,完结,撒花

总结

promise对象的出现让我们摆脱了回调地狱的情况,用promise写出来的代码可读性更强,更加的优美,调理更加的清晰,你学废了吗?哈哈哈