【问题标题】:Difference between catch and onErrorResumeNextcatch 和 onErrorResumeNext 的区别
【发布时间】:2014-10-29 15:12:51
【问题描述】:

在 RxJS 中,Observable 实例的 catch 方法和 onErrorResumeNext 方法之间似乎几乎没有区别,除了 onErrorResumeNext 将原始 Observable 与 Observable 参数连接起来是否发生错误。

如果是这样的话,是不是命名有点混乱?因为万一出现错误,onErrorResumeNext 的工作方式与 catch 的工作方式完全相同:

var testObservable = Rx.Observable.return(1).concat(Rx.Observable.throw("Error"))

// Both onError and onCatch will emit the same result: 1, 2
var onError = testObservable.onErrorResumeNext(Rx.Observable.return(2));
var onCatch = testObservable.catch(Rx.Observable.return(2));

是否有充分的理由不总是使用catch

【问题讨论】:

    标签: javascript system.reactive rxjs


    【解决方案1】:

    它们是不同的。

    正如您所指出的,两个运算符都以类似方式处理故障;但是,它们在完成处理方面有所不同。

    OnErrorResumeNext 只是一个具有以下语义的特化:

    “我的查询连接两个可观察对象。如果第一个可观察对象失败,则继续下一个可观察对象。”

    Catch 更为笼统:

    “我的查询避免了失败。如果 observable 失败,则继续另一个 observable。”

    如果您要避免连接边界上的失败,请使用OnErrorResumeNext;否则,为了避免失败,一般使用Catch

    【讨论】:

    • 该名称最有可能来自Visual Basic On Error Resume Next 语句,其语义类似于此运算符。
    • @Brandon 也是一个好点。不过我决定不提它,因为我认为如果它不是一个恰当的名称,Rx 团队就不会使用它。尽管 OP 的问题部分是关于语义的,但我决定将我的答案集中在运算符之间的差异上,这表明该名称实际上是合适的。
    • 您的回复很有道理,谢谢。我想混淆是关于命名的,因为正如你所指出的,onErrorResumeNext 的主要任务是连接,但这根本没有反映在名称中。
    • @GiantSquid 好吧,我认为“继续下一个”这个短语暗示了连接,但我可以看出一开始可能不清楚。
    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2014-04-14
    • 2011-02-20
    • 2013-06-20
    • 2010-12-14
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多