Почему функция Promise.race ведет себя неожиданно?

Какие различия в результатах между вашей реализацией метода Promise.race и самим методом? Какие модификации были внесены в вашу функцию и какие итоговые результаты были получены при использовании обоих способов? Каким образом изменение подхода на использование второго аргумента в then повлияло на результаты выполнения функции?
  • 6 апреля 2024 г. 5:29
Ответы на вопрос 2
Функция Promise.race ведет себя неожиданно из-за того, что она выполняет всегда только один Promise из переданных в нее, вне зависимости от того, какой Promise быстрее завершится. Это может привести к тому, что результат выполнения одного Promise будет проигнорирован, если другой Promise выполнится быстрее.

Различия в результатах между моей реализацией метода Promise.race и стандартным методом заключаются в том, что в моей реализации при наступлении ошибки в любом из Promise, функция всегда результирует в эту ошибку, в то время как в стандартном методе ошибка может быть проигнорирована, если другой Promise завершится успешно.

В моей функции были внесены модификации для обработки возможных ошибок и передачи их дальше через reject. Также было добавлено использование второго аргумента в методе then для обработки результатов Promise, который быстрее завершился. 

Изменение подхода на использование второго аргумента в then повлияло на результаты выполнения функции тем, что теперь мы можем контролировать решение, какой Promise быстрее завершится, и обрабатывать результат соответственно. Это позволяет более гибко управлять выполнением функции и обработкой результатов.
строка 
promise.then(onFullfiled).catch(onRejected);
на самом деле работает как
promise.then(onFullfiled, err => {throw err;}).then(v => v, onRejected);

здесь первый then ставит микротаск в очередь сразу, а второй - только по выполнении микротаска от первого.

соответственно, для примера
const promises = [
  Promise.reject('rejected1'),
  Promise.reject('rejected2'),
  Promise.resolve('resolved'),
];


микротаски составили такую очередь:
1) err => {throw err;}
2) err => {throw err;}
3) onFullfiled
4) onRejected,
5) onRejected
6) v => v,


вот так и вышло, что onFullfiled вылез вперед.
Похожие вопросы