Promise是异步任务同步化的解决方案?本文讲通过以下几方面来介绍Promise:
- Promise的出现为了解决什么问题
- Promise内部对任务的处理
- Promise的标准规范
- Promise的方法使用
- Promise在eventLoop中执行顺序
- 源码地址
Promise知识分五个章节来阐述,这篇我们讨论:Promise内部对任务的处理。
上文提到Promise的状态只能更改一次,可以解决信任问题。接下来我们讨论Promise中都有哪些状态以及状态和回调的关系。
三种状态 1.pending:初始化状态或在过程中还没有结果
2.resolved(又称Fulfilled):成功状态
3.rejected:失败状态
举例好说明:
new Promise((resolve,reject) =>{
setTimeout(()=>{
resolve('我的状态从pendding变成了resolved')
},1000)
reject('我的状态从pendding变成了rejected')
}).then(response=>{
console.log('我是成功的回调',response) //我是成功的回调 我的状态从pendding变成了resolved
}).catch(err=>{
console.log('我是失败的回调',err) //我是失败的回调 我的状态从pendding变成了rejected
})
当然这个例子不会走到成功的回调,因为在Promise中当pending状态变为rejected就不会再改变状态了,这也是为什么它可以解决信任问题的关键(无论成功与否都会给个答案)。概括一下:
当任务中调用了resolve函数 状态从pending => resolved 并触发.then回调,通过参数传递出resolve传值。
当任务中调用了reject函数 状态从pending => rejected 并触发.catch回调或.then回调,通过参数传递出reject传值。
一般Promise是对异步的封装,使其在内部统一执行完毕,给出一个指定的结果。这就是异步任务同步化的解决方案。
应用在实际当中,异步任务会有三个状态:
pending 等待网络请求或者定时器没有到时。
Fulfill 满足状态,请求成功有返回值,我们主动调用resolve后就处于该状态,回调then()。
rejected 拒绝状态,当请求超时或失败时,我们主动调用reject后就处于该状态,回调catch()。
如果此文章对您有帮助或启发,那便是我的荣幸