JavaScript Promisecallback是asynchronous执行的

假设我有这个代码

function y(resolve, reject) { console.log("Result"); resolve(); } var promise = new Promise(y); 

我想知道的是函数y是否会被asynchronous执行。

这取决于诺言的实施。 如果我们检查规范 。 你可以在这里find最终的规格 – 因为这个答案是最初写的,所以已经定稿了。

这里是相关的摘录(你可以在这里find原始资料)

  1. 让完成为Call(执行者,未定义,«resolvingFunctions。[[Resolve]],resolvingFunctions。[[Reject]]»)。
  2. 如果完成是一个突然完成,那么
    • 让状态为Call(resolvingFunctions [[Reject]],undefined,«completion。[[value]]»)。
    • ReturnIfAbrupt(状态)。

ES6标准表明履行承诺总是asynchronous的(参见25.4.5.3节, Promise.prototype.then和附带的第25.4.5.3.1节, PerformPromiseThen )。 我已经把相关材料放在下面。

PerformPromiseThen

  1. 否则,如果承诺的[[PromiseState]]内部插槽的值被“履行”
    • 让价值是诺言的[PromiseResult]内部槽的价值。
    • 执行EnqueueJob(“PromiseJobs”,PromiseReactionJob,“fulfillReaction,value”)。
  2. 否则,如果承诺的[[PromiseState]]内部插槽的值为“拒绝”,
    • 让理性成为承诺的[PromiseResult]内部槽的价值。
    • 执行EnqueueJob(“PromiseJobs”,PromiseReactionJob,“rejectReaction,reason”)。

TLDR :传递给promise的函数是同步执行的,但随后的调用总是asynchronous执行的。

另一个答案certificate了这一点,但让我来谈谈推理:

承诺构造函数

承诺构造函数callback(在ES6规范或构造函数规范库实现中指定)将始终同步执行 – 这是为了从中提取延迟(旧forms的承诺构造),以防需要访问到resolvecallback:

 var r; var p new Promise(function(resolve, reject){ r = resolve; }); // use r here, for example arr.push(r); 

thencallback

then将总是被asynchronous执行,几乎所有的主stream承诺实现(Native,bluebird,$ q,Q,when,rsvp,promise,jQuery(从3.0开始)等)以及原生承诺实现(或实现超集,with更多的约束) 承诺/ A + 。

Promise / A +就是由Promises / A创build的。 asynchronous保证将被保留,Zalgo不会被释放。 (另见这篇文章 )。

发生这种事情(asynchronous保证)是完全故意的积极地防止竞争条件 。 那么代码内外的代码总是以相同的顺序执行。

这里是相关的报价:

在执行上下文堆栈只包含平台代码之前,不能调用onFulfilledonRejected 。 [3.1]。