1、Promise
Promise 表示一个异步操作的最终结果,与之进行交互的方式主要是 then
方法,该方法注册了两个回调函数,用于接收 promise 的终值或本 promise 不能执行的原因。
一个 Promise 的当前状态必须为以下三种状态中的一种:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。
等待态(Pending)
处于等待态时,promise 需满足以下条件:
- 可以迁移至执行态或拒绝态
执行态(Fulfilled)
处于执行态时,promise 需满足以下条件:
- 不能迁移至其他任何状态
- 必须拥有一个不可变的终值
拒绝态(Rejected)
处于拒绝态时,promise 需满足以下条件:
- 不能迁移至其他任何状态
- 必须拥有一个不可变的据因
如果一旦状态变为成功或者失败,就不能再变为失败或者成功了。即promise状态一旦确定就不能再更改到其他状态。
promise 是一个拥有 then
方法的对象或函数,每个.then()方法都返回一个新的promise对象,与上个promise不是一个对象,是一个新的对象。
每次new 一个promise时,都需要传递一个执行器,是立即执行的。执行器中有两个参数resolve、reject。
如果一个执行器中有异步操作。则调用then时可能还是pendding状态。
如果resolve一个promise或者在then中继续return一个新的promise,都会等待这个新的promise执行完毕,以这个promise的状态来接着向后传递。
有如下代码:
Promise.resolve('foo')
等价于
new Promise(resolve => {resolve('foo)})
Promise.resolve()可快速将foo包装成一个promise。
2、Promise A+规范
运行 [[Resolve]](promise, x)
需遵循以下步骤:
如果 x
为 Promise ,则使 promise
接受 x
的状态:
- 如果
x
处于等待态,promise
需保持为等待态直至x
被执行或拒绝 - 如果
x
处于执行态,用相同的值执行promise
- 如果
x
处于拒绝态,用相同的据因拒绝promise
new Promise(resolve => {
resolve (new Promise(res => res()))
}).then(() => {
console.log("tick 1")
}).then(() => {
console.log("tick 2")
})
new promise(resolve => resolve(1)).then(() => {
console.log("1");
}).then(() => {
console.log("2");
}).then(() => {
console.log("3");
}).then(() => {
console.log("4");
})
若按照promise A+规范,在Node8中输出结果为,则输出应该是
tick 1
1
tick 2
2
3
4
但在谷歌最新版的浏览器中,输出为
1
2
tick 1
3
tick 2
4
即在最新版本的浏览器中,当x为promise时,会向后延迟两个tick。