ES2015承诺链 - 为什么宣传的功能立即运行?

时间:2016-05-05 12:20:53

标签: javascript

为什么以下打印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。

1 个答案:

答案 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()的打印。

.运算符的左侧必须先进行完全评估,否则无法查找"然后"属性。