Какие различия в результатах между вашей реализацией метода Promise.race и самим методом? Какие модификации были внесены в вашу функцию и какие итоговые результаты были получены при использовании обоих способов? Каким образом изменение подхода на использование второго аргумента в then повлияло на результаты выполнения функции?
Функция 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 вылез вперед.