Почему Promise.all () tigger Array.prototype.then, если определен? - PullRequest
7 голосов
/ 06 января 2020

Имея следующий кусок кода ...

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() для каждого из элементов в массиве. Это очевидно. Но какова цель сделать это над самим массивом?

Такое поведение происходит на V8

Для рассмотрения: Если вы измените Promise.all() до Promise.race() этого не происходит.

Я не говорю, что это ошибка. Я просто хочу понять причину. Если вы можете процитировать спецификацию EcmaScript в ответе, я был бы очень признателен.

Обновление: Я знаю, Promise.all() возвращает массив, но обернутый в обещание. Это тоже очевидно. Если вы удалите .then() как ...

Promise.all(array)

, он все равно выполнит метод .then().

1 Ответ

3 голосов
/ 06 января 2020

Когда вызывается resolve() и переданное ему значение имеет свойство .then, которое относится к функции, обычный механизм Promise вызовет эту функцию. В этом случае внутренний к Promise.all() массив значений разрешения создается при разрешении каждого Promise в исходном массиве. Когда это закончится, внутренности Promise.all() будут вызывать свои собственные resolve(), передавая массив разрешенных значений.

Хорошо, этот массив будет также иметь значение .then(), унаследованный от прототипа Array. Таким образом, этот вызов resolve() вызовет метод .then(), как и любое другое разрешение Promise.

Promise resolve() в спецификации c

...