为什么以下打印2 1 3
而不是1 2 3
正如我预期的那样?
(function() {
return new Promise(function(resolve) {
document.write('2');
resolve();
})
.then(log('1')); // I was expecting this `log` function invocation to run first
}());
function log(message) {
document.write(message);
return function() {
document.write('3');
}
}

我使用的是Chrome 49.0.2623.112 m。
答案 0 :(得分:4)
来自MDN:
执行程序函数由Promise实现立即执行,该实现提供resolve和reject函数(在Promise构造函数甚至返回创建的对象之前调用执行程序。)
您的初始匿名函数运行,并且在其中运行new Promise()
调用,并且首先执行的是运行您的executor函数(对构造函数的回调)。 那反过来立即调用document.write(2)
,所以你看到的第一件事就是2
。
编辑 - 在您的问题中看到澄清,它归结为简单的JavaScript调用顺序。你的Promise构造函数只包含return
语句,其形式为:
return new C(fn).then(expr);
JavaScript在开始处理表达式的其余部分之前完成new C(fn)
调用。一旦new
返回(此时2
已经打印),将评估表达式的.then(expr)
部分。这将通过1
的参数列表中的log()
调用触发.then()
的打印。
.
运算符的左侧必须先进行完全评估,否则无法查找"然后"属性。