订阅 onComplete 永远不会用 flatMap 完成
Subscribe onComplete never completes with flatMap
我将 Angular 6
与 RxJS 6.2.2
和 RxJS Compact 6.2.2
一起使用。
我有一个代码可以调用我的 api 服务来加载一些记录,它是:
this.route.params
.flatMap((params: Params) => {
if (!params['id']) {
return Observable.throwError('Id is not specified.');
}
this.itemId = params['id'];
this.isEditMode = true;
this.loadCategoryGroupCondition = new LoadCategoryGroupViewModel();
this.loadCategoryGroupCondition.id = [this.itemId];
this.loadCategoryGroupCondition.pagination = new Pagination();
return this.categoryGroupService
.loadCategoryGroup(this.loadCategoryGroupCondition);
})
.subscribe(
(loadCategoryGroupResult: SearchResult<CategoryGroup>) => {
console.log(loadCategoryGroupResult);
},
() => {},
() => {
console.log('Completed')
});
上面的代码可以打印从我的 api 服务返回的我的项目列表。这意味着 onSuccess 已被调用。
但是完整的方法被触发了。
我的代码有什么问题?
谢谢,
如前所述,flatMap
运算符本身并未完成其源可观察对象。您正在使用 this.route.params
作为您的源可观察对象,它是长期存在的 - 它永远不会自行完成。
要获得 complete
通知,您可以使用 take
等运算符。它将重新发出您作为参数传递的项目数,然后完成。例如,如果您只想接收当前路由并且对源 observable 的进一步通知不感兴趣,请使用 take(1)
,例如:
this.route.params
.take(1)
.flatMap((params: Params) => {
此外,请注意,在 RxJS 6+ 中执行此操作的推荐方法是使用可管道运算符。这看起来像这样:
this.route.params.pipe(
first(),
mergeMap((params: Params) => {
...
})
我还用更新的推荐变体替换了运算符。
我将 Angular 6
与 RxJS 6.2.2
和 RxJS Compact 6.2.2
一起使用。
我有一个代码可以调用我的 api 服务来加载一些记录,它是:
this.route.params
.flatMap((params: Params) => {
if (!params['id']) {
return Observable.throwError('Id is not specified.');
}
this.itemId = params['id'];
this.isEditMode = true;
this.loadCategoryGroupCondition = new LoadCategoryGroupViewModel();
this.loadCategoryGroupCondition.id = [this.itemId];
this.loadCategoryGroupCondition.pagination = new Pagination();
return this.categoryGroupService
.loadCategoryGroup(this.loadCategoryGroupCondition);
})
.subscribe(
(loadCategoryGroupResult: SearchResult<CategoryGroup>) => {
console.log(loadCategoryGroupResult);
},
() => {},
() => {
console.log('Completed')
});
上面的代码可以打印从我的 api 服务返回的我的项目列表。这意味着 onSuccess 已被调用。
但是完整的方法被触发了。 我的代码有什么问题?
谢谢,
如前所述,flatMap
运算符本身并未完成其源可观察对象。您正在使用 this.route.params
作为您的源可观察对象,它是长期存在的 - 它永远不会自行完成。
要获得 complete
通知,您可以使用 take
等运算符。它将重新发出您作为参数传递的项目数,然后完成。例如,如果您只想接收当前路由并且对源 observable 的进一步通知不感兴趣,请使用 take(1)
,例如:
this.route.params
.take(1)
.flatMap((params: Params) => {
此外,请注意,在 RxJS 6+ 中执行此操作的推荐方法是使用可管道运算符。这看起来像这样:
this.route.params.pipe(
first(),
mergeMap((params: Params) => {
...
})
我还用更新的推荐变体替换了运算符。