假设我有这个代码
function y(resolve, reject)
{
console.log("Result");
resolve();
}
var promise = new Promise(y);
我想知道的是函数是否y
会异步执行。
假设我有这个代码
function y(resolve, reject)
{
console.log("Result");
resolve();
}
var promise = new Promise(y);
我想知道的是函数是否y
会异步执行。
这取决于承诺的执行情况。如果我们检查规范。您可以在此处找到最终规范- 由于此答案最初是编写的,因此已最终确定。
这是相关摘录(您可以在此处找到原始来源)
ES6 标准表明承诺的实现总是异步的(参见第 25.4.5.3 节Promise.prototype.then
和随附的第 25.4.5.3.1 节PerformPromiseThen
)。我把相关材料放在下面。
TLDR:传递给 promise 的函数是同步执行的,但后续then
调用总是异步执行的。
另一个答案证明了这一点,但让我谈谈推理:
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 实现(或实现一个超集,还有更多约束)承诺/A+。
这正是Promises/A+ 是由 Promises/A 创建的原因。异步保证将被保留,Zalgo 不会被释放。(另见这篇文章)。
发生这种情况(异步保证)的事实完全是有意的,并且会主动防止竞争条件。内部和外部的代码then
将始终以相同的顺序执行。
这是相关的报价:
onFulfilled
或者onRejected
在执行上下文堆栈仅包含平台代码之前不得调用。[3.1]。