【问题标题】:Rxjs subscribe after catch is not called未调用 catch 后的 Rxjs 订阅
【发布时间】:2017-10-02 09:24:43
【问题描述】:

我有以下几行代码:

this.initializer.initialize()
    .catch((e) => { console.log('catch'); return Observable.empty() })
    .flatMap(() => { console.log('flatmap'); return this.route.params })
    .subscribe(() => { console.log('subscribe'); })

记录的输出是

catch

什么可能导致flatMap,因此订阅不被调用?不知道这里还有什么其他代码可以相关,如果需要其他代码,我会提供。

【问题讨论】:

    标签: rxjs rxjs5


    【解决方案1】:

    这显然是由this.initializer.initialize() 发出error 通知引起的(这是故意的吗?)。

    catch 运算符仅对 error 通知做出反应,而不是 nextcomplete

    flatMap() 运算符仅对 next 通知做出反应,而不是 errorcomplete

    您现在拥有的subscribe 调用仅处理next 通知。你也可以重写它来处理errors:

    .subscribe(
      () => console.log('subscribe'),
      err => console.log('error:', err), 
    )
    

    但是您使用的是catch,并且您基本上将错误替换为Observable.empty(),因此它永远不会到达订阅者,因此无论如何都不会调用错误处理程序。

    【讨论】:

    • 你可以将error 变成next 使用这个:.catch(e => Observable.of(e))
    • 如果 .catch 将错误变成下一个错误,那不应该用我上面的代码调用平面图吗?您的建议有效,但它给我留下了这个丑陋的代码:gist.github.com/Burgov/a1c06e79a1d233f90b87ffe32902d9e9,我有相同的下一个和错误处理程序。
    • 没错,flatMap 会被错误对象调用。
    • @BartvandenBurg 你能做一个 plnkr 或 jsbin 演示吗?你可以使用这个模板jsbin.com/rulaxiw/2/edit?html,js,output
    • 您在catch 中使用Observable.empty(),它只发出complete 通知而没有next 通知。这就是为什么不调用 subscribe 处理程序的原因。看到这个jsbin.com/yomirij/2/edit?html,js,console
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多