Почему Promise.race не возвращает ничего, когда один из параметров отклоняется - PullRequest
0 голосов
/ 04 мая 2018

Я создал 3 обещания, p1, p3 разрешить, а p2 отклоняет.

код:

            let p1 = new Promise((resolve, reject) => {
                resolve(42);
            });
            let p2 = Promise.reject(43);

            let p3 = new Promise((resolve, reject) => {
                resolve(44);
            });
            let p4 = Promise.race([p1, p2, p3]);

            p4.catch((value) => {
                console.log(value); 
            });

Исходя из кода, p4 должен возвращать 43, потому что p3 работает быстрее, чем p1 и p2. Когда я бегу в узле, он не возвращает ни одного. Как объяснить эту ситуацию в Promise.race?

Примечание. Пожалуйста, запустите этот код в консоли и ответьте на него. Он ничего не возвращает в моем регионе.

1 Ответ

0 голосов
/ 04 мая 2018

Как вы написали в своем примере, вы обещаете, p1, p2 и p3 все поселяются одновременно *.

Из документов Promise.race:

Если итеративный объект содержит одно или несколько не обещающих значений и / или уже выполнено / отклонено обещание, тогда Promise.race разрешит первое из этих значений найдено в итерируемом.

Хотя эти обещания еще не выполнены, когда они переданы race, поскольку все они рассчитываются одновременно, race будет использовать результат первого в списке. В данном случае это p1.

Итак:

p4.then(console.log) // Prints 42

, и вы можете убедиться в этом, заметив, что если вы измените порядок p1, p2 и p3 в массиве, который вы передаете race, вы всегда увидите результат первого .

let p1 = new Promise((resolve, reject) => {
  resolve(42);
});

let p2 = Promise.reject(43);

let p3 = new Promise((resolve, reject) => {
  resolve(44);
});

let p4 = Promise.race([p1, p2, p3]);
let p5 = Promise.race([p2, p1, p3]);
let p6 = Promise.race([p3, p2, p1]);

p4.then(r => console.log("p4", r), r => console.log("p4", r));
p5.then(r => console.log("p5", r), r => console.log("p5", r));
p6.then(r => console.log("p6", r), r => console.log("p6", r));
...