ECMAScript 6新增的引用类型Promise,可以通过new操作符实例化,创建Promise时候需要传入执行器函数作为参数。
Promise有三个状态:待定(pending),兑现(fulfiled),拒绝(rejected)
待定为Promise最初始的状态,在这个状态下Promise可以转换成兑现或者拒绝的状态,一旦发送改变,Promise的状态就再也不发生改变。
Promise的状态是私有的,不能直接通过JavaScript检测到,Promise的状态也不能被外部的JavaScript代码修改。
通过控制执行器函数来控制Promise的状态,执行器函数主要有两个职责:初始化Promise的异步行为和控制状态的最终转换。其中控制Promise状态的转换是通过调用它的两个函数参数实现的。
这两个参数是resolve()和reject()。调用resolve()会使Promise的状态变为兑现,调用reject()会使Promise的状态变为拒绝,另外调用reject()也会抛出错误
代码以及控制台输出如下
<script>
let p = new Promise((resolve,reject) => {
console.log('Promise对象已经初始化')
resolve(1)
})
console.log(p)
let p2 = Promise.resolve(2)
console.log(p2)
//以上代码效果等同
//resolve如果传入参数为Promise对象,那它的行为类似一个空包装
//所以以下两行代码效果相等
let p3 = Promise.resolve(3)
console.log(p3===Promise.resolve(p3))
//Promise.reject()接受一个参数,该参数为拒绝Promise的理由
//但没有照搬Promise.resolve的幂等逻辑
//如果传入一个Promise对象则该对象为拒绝Promise的理由
let p4 = Promise.reject(4)
console.log(p4)
let p5 = Promise.reject(p4)
console.log(p5)
</script>