【问题标题】:Why promise.race returns none when one of parameters reject?为什么当参数之一拒绝时 promise.race 不返回?
【发布时间】:2018-05-03 23:50:15
【问题描述】:

我创建了 3 个 promise,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 中如何解释这种情况?

注意:请在控制台中运行此代码然后回答它。 它不会返回我本地的任何内容。

【问题讨论】:

  • @ibowankenobi ,我刚刚看了那个帖子,Promise.race 没有代码
  • 订单不可信赖。您不能说 p3 甚至 p1 会比另一个运行得更快。您在事件循环的同一滴答声中评估了 4 个表达式,有一个单独的承诺微任务队列,您不能说哪个会运行得更快。
  • Np,祝你的项目好运。
  • 现在你可能发现你正在传递已解决或已拒绝的承诺,Promise.race 将返回它找到的第一个已解决或已拒绝的承诺,因此let p4 = Promise.race([p2,p1, p3]); 将在catch 中记录一些内容。如果您需要一个返回第一个承诺的函数,如果所有承诺都拒绝,则该承诺将解决或拒绝,您可以尝试this

标签: javascript node.js promise es6-promise


【解决方案1】:

正如您在示例中所写的那样,您承诺 p1、p2 和 p3 将同时结算*。

来自docs of 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));

【讨论】:

  • 嗨,事实是它什么都不返回,你可以在终端中运行它。它不能返回任何东西。
  • 我不确定您所说的 “它不能返回任何东西” 是什么意思。如果你的意思是你没有看到任何日志,那是因为你的 p4.catch( ... ) 代码永远不会执行,因为承诺不会拒绝,而是用 42 解决。
  • 我明白了,p2 已经被拒绝了,所以 p4 的结果被忽略了,所以 p4 中的 console.log(value) 什么都不返回,对吧?
  • 没有 p4 的“结果”是一个可以解析为 42 的承诺 - 你的 console.log 仅在 p4 拒绝时执行
猜你喜欢
  • 2022-01-20
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2017-04-30
  • 2019-11-22
相关资源
最近更新 更多