javascript - 如果已定义,为什么 Promise.all() 会触发 Array.prototype.then?

标签 javascript ecmascript-6 promise v8 ecma

有以下代码...

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()数组上的proto函数?

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

这种行为发生在 V8 上

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

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

更新:
我知道Promise.all()返回一个数组,但包装在一个 promise 上。这也很明显。如果您删除 .then()喜欢...

Promise.all(array)

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

最佳答案

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

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

Promise resolve() in the spec

关于javascript - 如果已定义,为什么 Promise.all() 会触发 Array.prototype.then?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59615739/

相关文章:

php - 根据单击哪个链接更改隐藏的 div 的内容

javascript - 从内部库捕获设置超时?

javascript - 为什么 "exact"不是 react 路由器中的默认行为

javascript - ReactJS 更改 url

reactjs - 如何使用 Jest 正确测试被拒绝的 Promise?

javascript - 如何在 sap ui5 中的文本字段中设置自动完成或自动建议(如 sap.m.Input)?

javascript - 如何为传播运算符创建 polyfill

javascript - 尽管启用了实验性 js,但 ECMA 6 不工作

angular - foreach 循环中的 promise ( typescript 2)

javascript - 如何将参数传递给询问者问题?