假设我有这段代码
function y(resolve, reject)
{
console.log("Result");
resolve();
}
var promise = new Promise(y);
我想知道的是函数y
是否会异步执行。
答案 0 :(得分:12)
这取决于承诺的实施。如果我们检查the spec。你可以找到最终的规范here - 因为这个答案是最初编写的,所以它已经完成了。
以下是相关摘录(您可以找到原始来源here)
ES6标准表明承诺的履行始终异步(参见第25.4.5.3节,Promise.prototype.then
和随附的第25.4.5.3.1节,PerformPromiseThen
) 。我已将相关材料放在下面。
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
内外的代码将始终以相同的顺序执行。
以下是相关引用:
在执行上下文堆栈仅包含平台代码之前,不得调用
onFulfilled
或onRejected
。 [3.1]。