Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 未调用RxJS5 finalize运算符_Angular_Rxjs_Observable_Rxjs5 - Fatal编程技术网

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。如果返回
,这将只对成功的有效负载响应有效。如果返回
错误
,则它将不起作用。