如果定义了 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 解析一样。
有如下代码...
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 解析一样。