Promise 构造函数回调是否异步执行?

IT技术 javascript promise es6-promise
2021-02-08 03:39:04

假设我有这个代码

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

var promise = new Promise(y);

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

2个回答

这取决于Promise的实现。如果我们检查规范. 您可以在此处找到最终规范- 由于此答案最初是编写的,因此已完成。

这是相关的摘录(您可以在此处找到原始来源

  1. 令完成为 Call(executor, undefined, «resolvingFunctions.[[Resolve]],resolutionFunctions.[[Reject]]»)。
  2. 如果完成是突然完成,那么
    • 让状态为 Call(resolvingFunctions.[[Reject]], undefined, «completion.[[value]]»)。
    • ReturnIfAbrupt(状态)。

ES6 标准表明Promise的履行始终异步的(参见第 25.4.5.3Promise.prototype.then节和随附的第 25.4.5.3.1 节,PerformPromiseThen)。我把相关材料放在下面。

执行Promise然后

  1. 否则,如果 promise 的 [[PromiseState]] 内部槽的值是“已完成”,
    • 让 value 为 promise 的 [[PromiseResult]] 内部槽的值。
    • 执行 EnqueueJob("PromiseJobs", PromiseReactionJob, «fulfillReaction, value»)。
  2. 否则,如果 promise 的 [[PromiseState]] 内部槽的值被“拒绝”,
    • 让reason 成为promise 的[[PromiseResult]] 内部槽的值。
    • 执行 EnqueueJob("PromiseJobs", PromiseReactionJob, «rejectReaction, reason»)。

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

不过,mozilla 版本更容易阅读,因为官方版本是 PDF
2021-03-13 03:39:04
将来,这个答案将过时且无关紧要(我应该知道,我有很多 js 答案都是这样的):D
2021-03-15 03:39:04
没有官方规范,因为它是草稿。相信我这不会改变。
2021-03-21 03:39:04
我会坚持以防万一,可能会有一些差异,尤其是对未来的读者(尽管规范在最终草案中,所以不太可能)
2021-03-24 03:39:04
希望它不是.. :P 我已经提交了最终的规范草案,有一个差异,但它是相当小的。
2021-03-30 03:39:04

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

Promise构造函数

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将始终异步执行,几乎所有主流 promise 实现(Native、bluebird、$q、Q、when、rsvp、promise、jQuery(从 3.0 开始)等)以及本机 promise 实现(或实现的超集,以及更多约束)Promise/A+

正是从Promises/A 创建 Promises/A+的原因异步保证将被保留,Zalgo 不会被释放。(另见这篇文章)。

发生这种情况(异步保证)的事实是完全有意的,积极防止了竞争条件内部和外部的代码then将始终以相同的顺序执行。

这是相关的报价:

onFulfilled或者onRejected在执行上下文堆栈仅包含平台代码之前不得调用。[3.1]。