JavaScript Promisecallback是asynchronous执行的
假设我有这个代码
function y(resolve, reject) { console.log("Result"); resolve(); } var promise = new Promise(y);
我想知道的是函数y
是否会被asynchronous执行。
这取决于诺言的实施。 如果我们检查规范 。 你可以在这里find最终的规格 – 因为这个答案是最初写的,所以已经定稿了。
这里是相关的摘录(你可以在这里find原始资料)
- 让完成为Call(执行者,未定义,«resolvingFunctions。[[Resolve]],resolvingFunctions。[[Reject]]»)。
- 如果完成是一个突然完成,那么
- 让状态为Call(resolvingFunctions [[Reject]],undefined,«completion。[[value]]»)。
- ReturnIfAbrupt(状态)。
ES6标准表明履行承诺总是asynchronous的(参见25.4.5.3节, Promise.prototype.then
和附带的第25.4.5.3.1节, PerformPromiseThen
)。 我已经把相关材料放在下面。
PerformPromiseThen
- 否则,如果承诺的[[PromiseState]]内部插槽的值被“履行”
- 让价值是诺言的[PromiseResult]内部槽的价值。
- 执行EnqueueJob(“PromiseJobs”,PromiseReactionJob,“fulfillReaction,value”)。
- 否则,如果承诺的[[PromiseState]]内部插槽的值为“拒绝”,
- 让理性成为承诺的[PromiseResult]内部槽的价值。
- 执行EnqueueJob(“PromiseJobs”,PromiseReactionJob,“rejectReaction,reason”)。
TLDR :传递给promise的函数是同步执行的,但随后的调用总是asynchronous执行的。
另一个答案certificate了这一点,但让我来谈谈推理:
承诺构造函数
承诺构造函数callback(在ES6规范或构造函数规范库实现中指定)将始终同步执行 – 这是为了从中提取延迟(旧forms的承诺构造),以防需要访问到resolve
callback:
var r; var p new Promise(function(resolve, reject){ r = resolve; }); // use r here, for example arr.push(r);
then
callback
then
将总是被asynchronous执行,几乎所有的主stream承诺实现(Native,bluebird,$ q,Q,when,rsvp,promise,jQuery(从3.0开始)等)以及原生承诺实现(或实现超集,with更多的约束) 承诺/ A + 。
Promise / A +就是由Promises / A创build的。 asynchronous保证将被保留,Zalgo不会被释放。 (另见这篇文章 )。
发生这种事情(asynchronous保证)是完全故意的 , 积极地防止竞争条件 。 那么代码内外的代码总是以相同的顺序执行。
这里是相关的报价:
在执行上下文堆栈只包含平台代码之前,不能调用
onFulfilled
或onRejected
。 [3.1]。