参考资料
- https://promisesaplus.com/
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
案例
setTimeout 和 Promise 执行顺序
示例代码如下:
setTimeout(() => console.log(1)) new Promise((resolve, reject) => { console.log(2) resolve() console.log(6) }).then(() => { console.log(3) }, () => { console.log(4) }) console.log(5)
输出结果是:26531
解析:- 运行时,调用栈先执行
- 创建 Promise 对象时,会立即执行传入构造函数中 executor 函数
- 因此输出 2 和 6,然后执行 then 函数,添加处理函数到 Promise 对象的消息处理队列中
- 继续执行调用栈中后续的代码,输出 5
- 调用栈执行完毕之后,会执行消息队列中的任务
- promise 对象的消息队列优先级高于 setTimeout
- 因此 3 比 1 先输出
Promise 的嵌套
示例代码如下:
new Promise((resolve, reject) => { console.log(1) resolve() new Promise((resolve, reject) => { console.log(4) resolve() }).then(() =>console.log(5)) }).then(() => { console.log(2) }, () => { console.log(3) }) new Promise((resolve, reject) => { console.log(6) resolve() }).then(() =>console.log(7))
输出结果:146527
解析:- 内部嵌套的 Promise 的队列,具有更高的优先级,因此 5 在 2 之前输出
- 先注册的 Promise 的队列具有更高的优先级,因此 7 比 2 先输出