Promise 回调的执行时机分析
Promise 是 JavaScript 中处理异步的一种模式, 可以大幅简化异步代码和增加可读性,基于 Promise 的单元测试 也更加可读。 本文参考了 Promises/A+、ECMA 2015 等文档, 测试了 Bluebird, Chrome 58.0.3029.110,Node.js 6.9.2 等环境,给出 Promise 异步行为。
TL; DR
Promise.prototype.then
传入的回调会在 NextTick(异步)执行- 构造 Promise 时传入的
executor
会立即执行 - Promise 的各种实现表现一致
onFulfilled 是异步的
根据 PerformPromiseThen 算法,调用 .then()
时会将 onFulfilled
, onRejected
两个回调作为新的 Job 传入 EnqueueJob (queueName, job, arguments)
。
即通过 .then()
传入的回调是异步执行的。
console.log('before .then call')
Promise.resolve('onFulfilled called').then(console.log)
console.log('after .then call')
输出为:
before .then call
after .then call
onFulfilled called
构造 executor 是同步的
传入 new Promise(<executor>)
的回调会立即执行,是同步的。例如:
console.log('before constructor call')
new Promise(() => console.log('executor called'))
console.log('after constructor call')
输出为:
before constructor call
executor called
after constructor call
本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2017/06/26/promise-callback-execution.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。