Rxjs 有没有一种方法可以将这个可观察的链集中在真实的数据上

Rxjs 有没有一种方法可以将这个可观察的链集中在真实的数据上,rxjs,rxjs5,Rxjs,Rxjs5,有没有办法重新构造下面的Obersable链,以便subscribe将处理实际数据,并且错误路径不会接管主路径 这意味着do()中的处理应该转到subscribe,删除过滤器,并从catch resorganizated开始,最后执行相同的操作 Rx.Observable.fromEvent(btnA, 'click') .switchMap(e => { let doThrow = doThrowInp.checked; output('Start some leng

有没有办法重新构造下面的Obersable链,以便subscribe将处理实际数据,并且错误路径不会接管主路径

这意味着do()中的处理应该转到subscribe,删除过滤器,并从catch resorganizated开始,最后执行相同的操作

Rx.Observable.fromEvent(btnA, 'click')
  .switchMap(e => {
    let doThrow = doThrowInp.checked;
    output('Start some lengthy op' + (doThrow ? ' that fails' : ''));
    let o = Rx.Observable.of(0).delay(2000);
    if (doThrow)
      o = o.throw('Error');
    return o;
  })
  .do(data => {
    output('Got the data we are interested in: ' + data);
  })
  .filter(_ => {
    output('Stop any data propagating further down');
    return false;
  })
  .catch((err, caught) => {
    output('We catched the error, inform the user and retry click listening');
    return Rx.Observable.concat(Rx.Observable.of({}), caught);
  })
  .switchMap(x => Rx.Observable.of('hidden').delay(3000).startWith('visible'))
  .subscribe(x => {
    output('Change error message visibility: ' + x);
    errorDiv.style.visibility = x;
  }, err => {
    output("Uups, we shouldn't get here" + err);
  });

查看Plunker上的所有内容:

我发现将复杂的可观察链分解为命名步骤非常有用,类似于Rx的“单一责任”

简化后,您可以重新组合,但为了清晰起见,我更愿意将其分步骤保留

生活

const click$=Rx.Observable.fromEvent(btnA,'click')
const lengthyOp$=可观测的(0)接收延迟(2000)
const lengthyOpWithErrorSimulator$=
lengthyOp$.flatMap(x=>
doThrowInp.checked
?Rx.可观察到的抛出(“错误”)
:Rx.可观察到的(x)
)
常数闪光器$=Rx.Observable.of('hidden')。延迟(3000)。startWith('visible'))
.do(x=>{
输出('更改错误消息可见性:'+x);
errorDiv.style.visibility=x;
})
单击$.flatMap(=>lengthyOpWithErrorSimulator$)
.catch((错误,捕获)=>{
输出(“我们捕获了错误,通知用户并重试单击侦听”);
flashError$.subscribe();
回捕;
})
.订阅(
data=>output('得到了我们感兴趣的数据:'+data),
err=>output(“Uups,我们不应该到这里”+err)
)

你说得对,像这样可读性更强。但是,它们有两个问题:1)在无抛出模式下,在等待答案时单击两次,返回两次答案,我希望第一个答案被取消,并且只返回第二个答案。2) 在抛出模式下,当消息显示时,再次单击会导致过早隐藏消息,第二个错误不会重新启动显示时间,或者更可能的情况是,第一个错误的隐藏不会被取消。1)听起来像
click$。switchMap(
.2)可能是订阅,但实际上并不喜欢它。我很快就会看一看。我现在为错误处理创建了一个主题,请参见这里:-这对我有用