我正在摧毁三个观察者,三个观察者中的每一个都拥有它自己的成功"使用.pipe(tap() => {...});
回调。当所有三个observable执行时没有错误,但是如果其中一个observable出错,则没有任何tap方法执行。如果observable成功运行,如何始终执行tap方法?
var request1 = Observable.create(...); //Pretend this one will fail (though request2 or request3 could also fail)
var request2 = Observable.create(...);
var request3 = Observable.create(...);
request1.pipe(tap(() => {
//Unique success callback should always run if request1 succeeds, even if request2 or request 3 fails.
}));
request2.pipe(tap(() => {
//Unique success callback should always run if request2 succeeds, even if request1 or request 3 fails.
}));
request3.pipe(tap(() => {
//Unique success callback should always run if request3 succeeds, even if request1 or request 2 fails.
}));
var observable = zip(request1, request2, request3);
observable.subscribe(() => {
//Do something when all three execute successfully
});
答案 0 :(得分:2)
我相信这是预期的,并且适合你所处理的行为。您可能希望使用catchError
lettable在每个请求中使用管道并返回一个空的observable。
request1.pipe(tap(() => {
//Unique success callback
}), catchError((err) => {
return empty();
}));
这样你就可以在不破坏新zip
的情况下处理该observable的错误。
答案 1 :(得分:0)
在您的代码中添加request1.pipe(tap(() => {
//Unique success callback I want to run if request2 succeeds.
//It should still run if request1 fails
}),
catchError(// Error occured)
);
块,您可以在其中跟踪错误。
fgColor
答案 2 :(得分:0)
@MichaelSolati几乎是正确的,除了
null
如果你希望看到subscribe()
中的输出 - 因为zip赢了empty()
tap()
回调不在zip()
管道中,它们是未订阅的单独分支,因此永远不会被激活。请注意,通过更改rxjs版本,导入可能会有点棘手,例如zip
可用作函数和运算符。
使用下面代码段中使用的rxjs.umd.js
cdn,我最初错误地使用了运算符,并且它不会抛出错误(但不起作用)。
我从上面的评论中注意到,您在 Angular 上下文中执行此操作。如果 你仍然有问题,请发布你的完整Angular模块与我们可以解决困难。
console.clear()
//console.log(rxjs)
// Get the operators and creators
const tap = rxjs.operators.tap
const empty = rxjs.empty
const zip = rxjs.zip
const catchError = rxjs.operators.catchError
const of = rxjs.of
const throwError = rxjs.throwError
//var request1 = of(1)
var request1 = throwError('error')
var request2 = of(2)
var request3 = of(3)
var req1 = request1.pipe(
tap(() => console.log('request1')),
catchError((err) => {
console.log('request1 has error')
return of(null)
})
);
var req2 = request2.pipe(
tap(() => { console.log('request2');})
);
var req3 = request3.pipe(
tap(() => { console.log('request3');})
);
var myObservable = rxjs.zip(req1, req2, req3);
myObservable.subscribe(
result => { console.log('result', result) }
);

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.2.0/rxjs.umd.js"></script>
&#13;