外部可观察对象永远不会完成或最终确定
Outer observable never complete or finalized
我有两个可观察对象。我如何顺序执行它们并一个接一个地获得完成的事件?
我试过 concatMap,但它似乎没有像我预期的那样工作。
this._activatedRouteService.queryParams
.pipe(
concatMap((params) => {
console.log('start');
if (typeof params['q'] === 'string') this._searchQuery = params['q'];
else this._searchQuery = null;
return this._postService
.searchPosts(this._searchQuery!)
.pipe(finalize(() => console.log('inner finalize')));
}),
finalize(() => {
console.log('outer finalize');
})
)
.subscribe(
(response) => {
this._posts = response?.data ?? this._posts;
},
(error) => {
if (error instanceof HttpErrorResponse) {
this._snackBarService.open(
'Failed to fetch posts.\n' +
(error.error?.message ?? 'Unknown error.'),
undefined,
{
duration: SnackBarConfig.ERROR_DURATIONS,
}
);
} else {
this._snackBarService.open(
'Failed to fetch posts.\nUnknown error.',
undefined,
{
duration: SnackBarConfig.ERROR_DURATIONS,
}
);
}
},
() => {
console.log('outer complete');
}
);
但是 outer finalize
或 outer complete
从未被调用。
从未记录 outer finalize
的原因是 _activatedRouteService.queryParams
从未完成。这是一个热门的可观察对象。
如果你希望在执行一次内部可观察对象后完成可观察对象,我建议使用 take()
运算符。在发送完整信号之前,它将“获取”从可观察对象发出的任意数量的值。
尝试在 concatMap()
之前的行中添加 take(1),
。
我有两个可观察对象。我如何顺序执行它们并一个接一个地获得完成的事件? 我试过 concatMap,但它似乎没有像我预期的那样工作。
this._activatedRouteService.queryParams
.pipe(
concatMap((params) => {
console.log('start');
if (typeof params['q'] === 'string') this._searchQuery = params['q'];
else this._searchQuery = null;
return this._postService
.searchPosts(this._searchQuery!)
.pipe(finalize(() => console.log('inner finalize')));
}),
finalize(() => {
console.log('outer finalize');
})
)
.subscribe(
(response) => {
this._posts = response?.data ?? this._posts;
},
(error) => {
if (error instanceof HttpErrorResponse) {
this._snackBarService.open(
'Failed to fetch posts.\n' +
(error.error?.message ?? 'Unknown error.'),
undefined,
{
duration: SnackBarConfig.ERROR_DURATIONS,
}
);
} else {
this._snackBarService.open(
'Failed to fetch posts.\nUnknown error.',
undefined,
{
duration: SnackBarConfig.ERROR_DURATIONS,
}
);
}
},
() => {
console.log('outer complete');
}
);
但是 outer finalize
或 outer complete
从未被调用。
从未记录 outer finalize
的原因是 _activatedRouteService.queryParams
从未完成。这是一个热门的可观察对象。
如果你希望在执行一次内部可观察对象后完成可观察对象,我建议使用 take()
运算符。在发送完整信号之前,它将“获取”从可观察对象发出的任意数量的值。
尝试在 concatMap()
之前的行中添加 take(1),
。