RxJS Observable遇错误停止发射值,如何处理后重新执行搜索?
解决方案
问题核心是catchError放置位置错误,导致整个Observable流在捕获到一次错误后就终止,无法响应后续的search$发射值。调整catchError的作用范围,同时优化重试逻辑即可解决:
步骤1:将catchError移入switchMap内部
原代码中catchError处于pipe最外层,一旦触发会终止整个流。把它放到switchMap里,仅捕获单次搜索请求的错误,不会影响search$后续的发射:
this.batcher = this.search$ .pipe( map((search) => ({ ...search, semantic: !this.semanticDisabled && search.semantic, })), switchMap((search) => this.service.search({ ...search!, ...this.searchConfig, }).pipe( // 仅处理当前请求的错误,不中断整个流 catchError((error) => { if (error.message === 'semantic_unavailable') { this.semanticDisabled = true; // 直接发起无语义搜索请求 return this.service.search({ ...search!, semantic: false, ...this.searchConfig, }); } else { this.requestError = true; this.res = undefined; return EMPTY; } }) ) ) )
步骤2:逻辑优化说明
- 避免通过调用
stackSearch(false)触发search$.next(),而是直接在catchError中返回新的搜索Observable,减少流的额外触发,保持逻辑纯净。 - 调整后
search$流会持续活跃,用户后续输入仍能正常触发新的搜索请求。
内容的提问来源于stack exchange,提问作者Nicolas Delahaie
相关产品推荐
相关产品推荐

