为什么 Promise.all() 触发 Array.prototype.then 如果定义?

Ivá*_*hez 7 javascript v8 ecma promise ecmascript-6

有以下代码...

const array = [
  Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)
];

Array.prototype.then = function () {
  console.log('Why does this gets triggered?');
}

Promise.all(array)
  .then(result => console.log(result))
Run Code Online (Sandbox Code Playgroud)

为什么它Promise.all()本身会.then()在 Array 上调用我的proto 函数?

当然,它必须调用.then()数组中的每个元素。这很明显。但是在 Array 本身上这样做的目的是什么?

这种行为发生在 V8 上

要考虑:如果您更改Promise.all()Promise.race()这种情况不会发生。

我并不是说这是一个错误。我只是想了解原因。如果您能在答案中引用 EcmaScript 规范,我将不胜感激。

更新: 我知道Promise.all()返回一个数组但包装在一个承诺上。这也是显而易见的。如果删除.then()喜欢...

Promise.all(array)
Run Code Online (Sandbox Code Playgroud)

它仍然执行该.then()方法。

Poi*_*nty 3

resolve()调用 a 时,并且传递给它的值具有.then引用函数的属性,正常的 Promise 机制将调用该函数。在这种情况下,Promise.all()当源数组中的每个 Promise 得到解析时,就会构建解析值数组的内部。完成后, 的内部结构Promise.all()将调用它自己的resolve(),并传入解析值的数组。

那么该数组还将一个.then()从 Array 原型继承的值。因此,该调用将像任何其他 Promise 解析一样resolve()调用该方法。.then()

resolve()规范中的承诺