JavaScript Promise Callback是否异步执行

时间:2015-04-30 08:48:41

标签: javascript promise es6-promise

假设我有这段代码

function y(resolve, reject)
{
  console.log("Result");
  resolve();
}  

var promise = new Promise(y);

我想知道的是函数y是否会异步执行。

2 个答案:

答案 0 :(得分:12)

这取决于承诺的实施。如果我们检查the spec。你可以找到最终的规范here - 因为这个答案是最初编写的,所以它已经完成了。

以下是相关摘录(您可以找到原始来源here

  1. 让完成为Call(执行者,未定义,«resolvingFunctions。[[Resolve]],resolvingFunctions。[[Reject]]»)。
  2. 如果完成是突然完成,那么
    • 让状态为Call(resolvingFunctions。[[Reject]],undefined,«completion。[[value]]»)。
    • ReturnIfAbrupt(状态)。
  3. ES6标准表明承诺的履行始终异步(参见第25.4.5.3节,Promise.prototype.then和随附的第25.4.5.3.1节,PerformPromiseThen) 。我已将相关材料放在下面。

    PerformPromiseThen

    1. 否则,如果promise的[[PromiseState]]内部插槽的值已“满足”,
      • 设value为promise [[PromiseResult]]内部插槽的值。
      • 执行EnqueueJob(“PromiseJobs”,PromiseReactionJob,«fulfillReaction,value»)。
    2. 否则,如果promise的[[PromiseState]]内部插槽的值被“拒绝”,
      • 让理由成为promise [[PromiseResult]]内部插槽的价值。
      • 执行EnqueueJob(“PromiseJobs”,PromiseReactionJob,«rejectReaction,reason»)。
    3. TLDR :传递给promise的函数是同步执行的,但后续的then调用总是异步执行。

答案 1 :(得分:7)

另一个答案证明这个,但让我谈谈推理:

承诺构造函数

promise构造函数回调(在ES6规范或构造函数规范库实现中指定)将始终同步执行 - 这是为了在需要时从中提取延迟(旧形式的promise构造)有权访问resolve回调:

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

then回调

then将始终异步执行,几乎所有主流承诺实现(Native,bluebird,$ q,Q,when,rsvp,promise,jQuery(3.0)等)以及本机承诺实现(或实现具有更多约束的超集)Promises/A+

正是的原因 Promises / A +是由Promises / A创建的。异步保证将被保留,Zalgo将不会被释放。 (另见this post)。

这种情况发生(异步保证)完全故意主动阻止竞争条件then内外的代码将始终以相同的顺序执行。

以下是相关引用:

  在执行上下文堆栈仅包含平台代码之前,不得调用

onFulfilledonRejected。 [3.1]。