Angular 未调用RxJS5 finalize运算符
我正试图在执行所有观察时触发回调。在我的另一个老项目中,我使用了Angular 未调用RxJS5 finalize运算符,angular,rxjs,observable,rxjs5,Angular,Rxjs,Observable,Rxjs5,我正试图在执行所有观察时触发回调。在我的另一个老项目中,我使用了最后这样的方法,效果非常好: this.myService.callDummy() .finally(()=>console.log('Works!')) .订阅(结果=>…) 但是现在我使用了一个新版本的RxJS,它带有可管道操作符,但是finally调用(现在重命名为finalize)从未执行过。几乎找不到什么信息,我也不确定我做错了什么 组合测试( this.route.queryParams, this.myService
最后
这样的方法,效果非常好:
this.myService.callDummy()
.finally(()=>console.log('Works!'))
.订阅(结果=>…)
但是现在我使用了一个新版本的RxJS,它带有可管道操作符,但是finally
调用(现在重命名为finalize
)从未执行过。几乎找不到什么信息,我也不确定我做错了什么
组合测试(
this.route.queryParams,
this.myService.callDummy1(),
this.myService.callDummy2()
)
.pipe(finalize(()=>console.log('notwork!')))
。订阅(结果=>…);
非常感谢您的帮助。您确定组合的
可观察的中的一个确实完成了吗?使用.complete
或.error
如果组合的可观察对象
均未完成,则永远不会调用最终
。如果要在可观察对象完成时执行某项操作,请使用完整回调,而不是最终/最终:
。订阅(
value=>{console.log(`Next:${value}`);},
error=>{console.log(`error:${error}`);},
()=>{console.log(`Completed`);}
);
无论如何,finally/finalize也应该可以工作,并在出错或完成时调用。我很确定你的观察永远不会完成。您可以使用我上面的代码来确认这一点
我看到您正在使用Angular并订阅此.route.queryParams,这永远不会完成。您可以使用first()
创建一个新的observable,这样您就可以获得值并立即完成:this.route.queryParams.pipe(first())
在observable中,触发和完成不是一回事
即使每个项都发出一个值,route.queryParams根据定义也永远不会完成,因为Angular就是这样实现的,作为一个非终止的可观察对象。您将需要手动完成它,以便finalize执行,因为CombineTest只有在其内部组合的每个可观察对象都已完成时才会完成
组合测试(
this.route.queryParams.pipe(take(1)),//take(1)将在发出一个值后完成observable
this.myService.callDummy1(),
this.myService.callDummy2()
)
.pipe(finalize(()=>console.log('notwork!')))
。订阅(结果=>…);
这将完成。请在StackBlitz上写一个工作片段。这个.route.queryParams是什么?。最有可能的是,您的一个源观测值没有完成。@martin它们都完成了。如果有3个结果对象,则结果是一个数组。所有都是预期的结果。@NicoVanBelle你能做一个演示吗?你误解了“完成”的含义,可观察的queryParams从未完成,所以这是按预期运行的。是的,它们都完成了。此代码的唯一问题是,finalize
不起作用。this.route.queryParams
不完整@Mick提到,它们返回了值,但实际上没有完成。当我使用combinelateest
时,他们给我留下了错误的印象,但这正是问题所在;当使用此选项时,不必完成观察。在RxJS 5.5中,您不应使用.take()
(patch prototype),而应使用.pipe(take())
小细节作为本问题的最终目的take(1)
成功了,但我也将combinelateest
替换为forkJoin
,因为它的功能是由take
完成的,而且它还希望观察到的内容能够完成。这样做,调试和查看哪些观测值还没有完成就更容易了。@NicoVanBelle您将此答案标记为已接受答案,而我的答案具有相同的信息,但要多得多detailed@NicoVanBelle当我期望我的观测值在1次发射后完成时,我更喜欢forkJoin,当我期望它们继续发射时,我更喜欢CombineTest。如果返回值
,这将只对成功的有效负载响应有效。如果返回错误
,则它将不起作用。