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。如有疏漏、谬误、侵权请通过评论或 邮件 指出。