Rxjs 有没有一种方法可以将这个可观察的链集中在真实的数据上
有没有办法重新构造下面的Obersable链,以便subscribe将处理实际数据,并且错误路径不会接管主路径 这意味着do()中的处理应该转到subscribe,删除过滤器,并从catch resorganizated开始,最后执行相同的操作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
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)可能是订阅,但实际上并不喜欢它。我很快就会看一看。我现在为错误处理创建了一个主题,请参见这里:-这对我有用