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

Why does Promise.all() tigger Array.prototype.then if defined?

有如下代码...

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))

为什么 Promise.all() 自己在数组上调用我的 .then() 原型函数?

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

此行为发生在 V8

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

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

更新: 我知道 Promise.all() returns 一个数组,但包裹在一个承诺中。这也是显而易见的。如果你删除 .then() 比如...

Promise.all(array)

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

当调用 resolve() 时,传递给它的值有一个 .then 属性 引用一个函数,正常的 Promise 机制将调用该函数。在这种情况下,在 Promise.all() 内部构建了一个解析值数组,因为源数组中的每个 Promise 都已解析。完成后,Promise.all() 的内部将调用它自己的 resolve(),传入已解析值的数组。

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

Promise resolve() in the spec