【问题标题】:Chaining switchMap链接 switchMap
【发布时间】:2017-05-14 20:04:02
【问题描述】:

我试图了解当两个(或更多)switchMaps 被链接时会发生什么。

我正在使用这个示例代码:

.switchMap(r => someCondition(r) ? Observable.throw(r._body) : Observable.of(r.json()))
.switchMap(r => r.error ? Observable.throw(new Error(r.error)) : Observable.of(r))
.catch(this.handleError.bind(this));

这里会发生什么?如果someCondition(r) 为真,throw 将会发生,我相信catch 会从那里被执行。如果someCondition(r) 为假,那么第二个switchMap 将进入,但它会接收什么作为参数? rjson() 输出?还是只是r

或者我完全错了,在这种情况下,我可以解释那里到底发生了什么吗?

【问题讨论】:

  • 实际运行时发生了什么?
  • @OliverCharlesworth 我实际上无法运行代码,因为我无法重现 r 的所有可能条件,所以我试图了解它的行为方式。
  • 当然可以,但绝对可以模拟一个更简单的情况(例如,someCondition 只是替换为truefalse)。
  • @OliverCharlesworth 是的,我可以用 true/false 替换 someConditon,但这是我能做的最多的事情,而无需进一步了解 switchMap 实际如何处理链接。
  • switchMap(r => some_made_up_logic).subscribe(x => console.log(x)) 将允许您观察(双关语)switchMap 在各种情况下的行为。

标签: javascript angular rxjs


【解决方案1】:

这里会发生什么?如果 someCondition(r) 为真,就会发生 throw,然后我相信 catch 会被执行。

是的。

如果 someCondition(r) 为假,那么第二个 switchMap 将进入,但它会接收什么作为参数? r 的 json() 输出?还是只是 r?

第一个switchMap 将返回Observable.of(r.json()),然后将其展平,因此第二个switchMap 中的r 将是r.json()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2020-03-31
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    相关资源
    最近更新 更多