未使用zip调用RxJS管道

未使用zip调用RxJS管道,rxjs,rxjs-pipeable-operators,Rxjs,Rxjs Pipeable Operators,我正在压缩三个可观察对象,三个可观察对象中的每一个都有自己的“成功”回调,使用.pipe(tap()=>{…})。当所有三个可观察对象都无错误地执行时,这种方法可以很好地工作,但如果其中一个可观察对象出错,则不会执行任何tap方法。如果observable成功运行,我如何让tap方法始终执行 var request1 = Observable.create(...); //Pretend this one will fail (though request2 or request3 could

我正在压缩三个可观察对象,三个可观察对象中的每一个都有自己的“成功”回调,使用
.pipe(tap()=>{…})。当所有三个可观察对象都无错误地执行时,这种方法可以很好地工作,但如果其中一个可观察对象出错,则不会执行任何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
});

在代码中添加可跟踪错误的
catch

request1.pipe(tap(() => {
    //Unique success callback I want to run if request2 succeeds.
    //It should still run if request1 fails
}),
    catchError(// Error occured)
);

我相信这是意料之中的事,也是你处理事情的适当行为。您可能想看看如何将
catchError
lettable管道化到每个请求中,并返回一个空的observable

request1.pipe(tap(() => {
    //Unique success callback
}), catchError((err) => {
    return empty();
}));

这样,您在不破坏新的
zip

@MichaelSolati的情况下处理可观察到的错误几乎是正确的,除了

  • 如果希望在
    subscribe()
    中看到输出,则应该捕获并返回一个值,例如
    null
    ——因为zip不会在
    empty()中启动
  • 您的
    tap()
    回调不在
    zip()
    管道中,它们是未订阅的独立分支,因此永远不会被激活
请注意,随着rxjs版本的更改,导入可能会变得有点棘手,例如
zip
可以作为函数和运算符使用。
下面的代码片段中使用了
rxjs.umd.js
cdn,我最初错误地使用了操作符,它没有抛出错误(但不起作用)

我从上面的评论中注意到,您是在一个角度上这样做的。如果 您仍然有一个问题,请发布完整的角度模块与进口,我们可以解决这个困难

console.clear()
//console.log(rxjs)
//找到操作员和创建者
const tap=rxjs.operators.tap
const empty=rxjs.empty
const zip=rxjs.zip
const catchError=rxjs.operators.catchError
常数=rxjs.of
const throwError=rxjs.throwError
//var request1=of(1)
var request1=throwError('错误')
var request2=of(2)
var request3=of(3)
var req1=request1.pipe(
轻触(()=>console.log('request1'),
catchError((err)=>{
console.log('request1有错误')
返回(空)
})
);
var req2=request2.pipe(
点击(()=>{console.log('request2');})
);
var req3=request3.pipe(
点击(()=>{console.log('request3');})
);
var myObservable=rxjs.zip(需求1、需求2、需求3);
myObservable.subscribe(
结果=>{console.log('result',result)}
);

这与angular有什么关系?@Jota.Toledo因为我使用了
Observable.create
而不是
httpClient.post
在我的示例中,你投了反对票吗?谢谢你的反馈,尽管我认为这不是我想要的。我更新了上面的评论以澄清问题。谢谢你的反馈,尽管我认为这不是我想要的。为了澄清,我更新了上面的评论。