【问题标题】:resolve vs reject in promise algorithms承诺算法中的解决与拒绝
【发布时间】:2016-01-16 09:13:46
【问题描述】:

在常见的承诺模式中,resolve 代表成功,而reject 代表失败。

但在基于 Promise 的算法产生布尔结果时,success/failure 的概念不适用,因此无法明确决定解决或拒绝哪个结果。

即使结果不是布尔值,也可能无法清楚地区分适合解决或拒绝。

对于在这种情况下选择解决还是拒绝模式,是否有任何官方建议?最好在知道和不知道哪种类型的结果会比其他类型的结果更多的情况下。

【问题讨论】:

  • 你在说什么类型的承诺? A+?
  • @MinusFour,有没有一种不是基于或解决/拒绝操作的承诺?如果不是,则不适用于该问题。
  • 它是适用的,因为并非所有的 Promise 实现都会在布尔结果中留下这种模糊性。 A+ 规范定义了解决和拒绝的独立控制,因此您永远不会说模棱两可(正如您所说的那样)。

标签: promise


【解决方案1】:

当涉及到连续链接的 Promise 时,reject 和 resolve 之间有一个重要区别,如下所示:

a().then(b).then(c).catch(d);

在这种情况下,a() 解析还是拒绝会有很大的不同,因为如果它拒绝,则不会调用 bc

因此,出于链接能力的目的,成功的结果应该使用您想要返回的任何值来解决,并且您不会使用拒绝来表示 false 值,因为这会破坏通常链接其他异步操作的能力.

Reject 应该发出一个错误信号,连续链接的操作不应从该错误继续(除非您专门处理错误情况并将其编码为继续)。

【讨论】:

    【解决方案2】:

    拒绝表示发生了异常/错误。存在语言错误(例如取消引用空指针)和应用程序错误(例如错误的 HTTP 请求)。如何定义什么是例外,什么不是,完全取决于您。 false 值可能非常接近 resolved,因为它是一个非常好的值,或者它可以被您的应用程序视为错误值(例如,它在逻辑上永远不应该为假,因此它是一个例外)并且然后你可以reject 代替它。

    【讨论】:

    • 我提到的算法没有错误或异常,只是处理路径不同。
    • 如果不是错误/异常,则resolve该值并使用控制语句/表达式根据布尔值确定下一步要走的路径。
    • 这意味着整个算法永远不会有reject,只有resolve。我不确定那会照顾好它。逻辑路径可能另有说明。然后是如何组织它的问题。
    • 你为什么首先在你的算法中使用 Promise?您是否正在执行某种异步操作,例如进行网络调用或访问文件系统?
    • 异步计算涉及:从文件中读取额外数据,跨NodeJS进程同步计算。
    【解决方案3】:

    布尔值 false 和异常之间是有区别的。

    【讨论】:

    • 我什至不知道如何回答这样的问题。
    猜你喜欢
    • 2023-03-26
    • 2013-06-22
    • 1970-01-01
    • 2019-08-06
    • 2021-11-02
    • 1970-01-01
    • 2016-10-20
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多