RxJS管道不用拉链调用

时间:2018-06-01 17:33:40

标签: rxjs rxjs-pipeable-operators

我正在摧毁三个观察者,三个观察者中的每一个都拥有它自己的成功"使用.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
});

3 个答案:

答案 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;
&#13;
&#13;