这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
前言
promise对象是es6中新增的,用来解决回调地狱的问题,可以实现把异步的操作用同步的形式实现,这样做更符合人们看代码的习惯,而不用在回调中一层一层的去找代码运行到了哪里。
promise的三种状态
- Fulfilled:成功状态
- Rejected:失败状态
- Pending:成功和失败之外的状态,可以理解为promise对象实例创建时候的初始状态
promise的两个方法
- resolve:使promise状态改变为成功,同时传递一个参数用于后续成功后的操作
- reject:使promise状态改变为失败,同时将错误信息传递给后续失败后的操作
为什么要用promise
故事背景 北方的豆腐大家应该都吃过,但豆腐的制作过程大家知道吗,一块豆腐的产生要经过好多的步骤,包括种豆子,打碎豆子,加热打碎了的豆子,过滤,沉淀,压制等等,我们这里就不细说,我们就假设有三步。
- 豆子成熟
- 豆子制豆粉
- 豆粉制成豆腐
代码如下:
//种大豆
function fun1(){
setTimeout(function() {
console.log('豆子成熟了')
},3000)
}
//大豆磨成豆粉
function fun2(){
setTimeout(function(){
console.log('豆粉制作成功了')
},2000)
}
//豆粉制作豆腐
function fun3(){
console.log('豆腐做好了')
}
fun1()
fun2()
fun3()
运行结果如下:
咦,这是怎么回事,怎么和我想要的结果不一样呢。这里就牵扯到了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写出来的代码可读性更强,更加的优美,调理更加的清晰,你学废了吗?哈哈哈