Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Angular 9/rxjs:如何处理switchMap内部抛出的错误?

Angular 9/rxjs:如何处理switchMap内部抛出的错误?
EN

Stack Overflow用户
提问于 2020-06-25 04:17:46
回答 2查看 1.6K关注 0票数 1

我使用的是Angular (9) powered Bootstrap (6.1.0) TypeAhead,它的搜索函数定义如下:

代码语言:javascript
运行
AI代码解释
复制
search = (text$: Observable<string>) => {
    return text$.pipe(
      debounceTime(200),
      distinctUntilChanged(),
      // switchMap allows returning an observable rather than maps array
      switchMap((searchText) => {
        if (!searchText || searchText.trim().length == 0) {
          // when the user erases the searchText
          this.dealerRepUserID = 0;
          this.dealerRepChanging.emit(this.dealerRepUserID);
          return EMPTY;
        }
        else if (this.dealerID == this.hostOrganizationID) {
          // get a list of host reps
          return this.myService.getHostRepsAutoComplete(searchText, this.includeInactive);
        } else {
          // get a list of dealer reps
          return this.myService.getDealerReps(this.dealerID, searchText);
        }
      })
    );
  }

该函数必须返回一个可观察对象。如何捕获在switchMap中抛出的错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-25 04:24:32

你试过catchError吗?

代码语言:javascript
运行
AI代码解释
复制
import { catchError } from 'rxjs/operators';
代码语言:javascript
运行
AI代码解释
复制
return text$.pipe(
      debounceTime(200),
      distinctUntilChanged(),
      // switchMap allows returning an observable rather than maps array
      switchMap((searchText) => {
        if (!searchText || searchText.trim().length == 0) {
          // when the user erases the searchText
          this.dealerRepUserID = 0;
          this.dealerRepChanging.emit(this.dealerRepUserID);
          return EMPTY;
        }
        else if (this.dealerID == this.hostOrganizationID) {
          // get a list of host reps
          return this.myService.getHostRepsAutoComplete(searchText, this.includeInactive).pipe(catchError(error => of());
        } else {
          // get a list of dealer reps
          return this.myService.getDealerReps(this.dealerID, searchText).pipe(catchError(error => of());
        }
      })
    );

这是我的应用效果

代码语言:javascript
运行
AI代码解释
复制
public loadDataPerformance$: Observable<Action> = createEffect(() => {
    return this.actions$.pipe(
      ofType(RiskProfileActions.loadDataPerformance),
      withLatestFrom(
        this.store$.select(fromRoot.getAnalyticsFilterSelectedOptions),
        this.store$.pipe(select(fromFactoryPerformance.getFactoryId))
      ),
      switchMap(([{ recordDate }, filters, factoryId]) =>
        this.riskProfileApiService.getDataPerformanceData(filters, factoryId, recordDate).pipe(
          map((riskDataPerformanceData: PerformanceDataModel) =>
            RiskProfileActions.loadRiskScoreBreakdownPerformanceSuccess(riskDataPerformanceData)
          ),
          catchError(error => of(RiskProfileActions.loadRiskScoreBreakdownPerformanceFail(error)))
        )
      )
    );
  });
票数 2
EN

Stack Overflow用户

发布于 2020-06-25 10:14:02

switchMap本身不会抛出任何错误,可能会产生意想不到的事情是返回的可观察对象this.myService.getHostRepsAutoCompletethis.myService.getDealerReps。捕获错误的一个棘手时刻是,每当有error时,抛出错误的可观察对象就会被杀死。

例如

代码语言:javascript
运行
AI代码解释
复制
observable$.pipe(
 switchMap(() => observable2$),
 catchError(() => doSomethingFunction())
).subscribe()

一旦出现错误,observable$将被完成,这将完成您的搜索流,错误发生后,您将不会获得更多数据。

正如Phat Tran Ky在他的示例中所展示的那样,错误的处理应该发生在switchMap操作符的新流中

代码语言:javascript
运行
AI代码解释
复制
observable$.pipe(
 switchMap(() => observable2$.pipe(catchError(() => doSomethingFunction())),
 )
).subscribe()

这样,每当内部抛出错误时,它将终止内部可观察对象(observable2$),但不会终止外部可观察对象observable$上的外部订阅

为了在一个点处理错误,您可以执行的进一步增强可能是将内部可观察对象合并到一个点中,例如,如下所示

代码语言:javascript
运行
AI代码解释
复制
observable$.pipe(
 switchMap(() => {
   return merge(
   observable1$.pipe(filter(() => ${your if else condition for case 1})),
   observable2$.pipe(filter(() => ${your if else condition for case 2})),
   observable3$.pipe(filter(() => ${your if else condition for case 3})),
   ).pipe(catchError((error) => yourErrorHandlerFunction(error)))
  })),
 )
).subscribe()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62567799

复制
相关文章
Android自定义按钮状态背景
如果你觉得Android自带的按钮默认、按下时样式太low,可以尝试自定义按钮状态背景:
张拭心 shixinzhang
2022/11/30
8210
为wordpress添加google+按钮
作者:matrix 被围观: 1,093 次 发布时间:2013-09-10 分类:Wordpress 兼容并蓄 | 无评论 »
HHTjim 部落格
2022/09/26
5450
为wordpress添加google+按钮
unity 背景根据按钮数量变化
立羽
2023/08/24
1570
unity 背景根据按钮数量变化
【CSS】CSS 背景设置 ⑧ ( 背景设置案例 | 导航栏按钮 )
在 div 盒子中的 a 标签是 行内元素 , 为其设置宽高是无效的 , 首先要将其转为 行内块样式 ;
韩曙亮
2023/03/30
4.6K0
【CSS】CSS 背景设置 ⑧ ( 背景设置案例 | 导航栏按钮 )
【HTML】HTML 表单 ② ( 按钮表单 | 普通按钮 | 提交按钮 | 重置按钮 | 图片按钮 | 文件域 )
将 <input /> 标签 的 type 属性设置为 button , 就可以将该 表单组件 设置为 普通按钮 类型表单 ;
韩曙亮
2023/03/30
8.5K0
【HTML】HTML 表单 ② ( 按钮表单 | 普通按钮 | 提交按钮 | 重置按钮 | 图片按钮 | 文件域 )
给 WordPress 博客添加 Google Buzz 按钮
Google Buzz 是 Google 推出的整合在 Gmail 中分享个人状态信息和其他动态的工具,只要是 Gmail 用户,就可以在 Buzz 中通过空开或者私密的方式来分享文字,图片,视频等信息,在移动设备中,还可以通过 Buzz 向好友分享地理位置,并且 Google Buzz 还可以直接导入个人的 Twitter,Picasa,Google Reader,博客等各种内容。 由于 Google Buzz 整合到 Gmail 中,所以这个服务一开始,就有非常多的用户,那么如何让博客读者把你的博客中的日志分享到 Google Buzz 中,让你的博客日志在更多的用户分享和传播呢?今天我就讲解下如何添加 Google Buzz 按钮到 WordPress 博客当中。
Denis
2023/04/14
9220
给 WordPress 博客添加 Google Buzz 按钮
一个类似抖音 APP 拍摄按钮效果的控件
效果图预览 用法 <net.angrycode.library.TouchButton android:id="@+id/touch_btn" android:layo
阳仔
2019/07/31
8480
一个类似抖音 APP 拍摄按钮效果的控件
跟我学Rx编程——调皮的背景音乐按钮
有些H5的页面会有一个按钮控制背景音乐播放,如果只是单一页面的话,没有什么逻辑可言。但如果涉及到转场,那么逻辑就复杂起来。
我不是码神
2022/07/28
5360
Android开发 点击按钮切换背景的两种方法
第一种方式 第二种方式 获取ListView某个Item中的控件
用户2192970
2019/02/21
2.7K0
Android开发 点击按钮切换背景的两种方法
CSS好看的按钮
好看的按钮 <style> .btn { BORDER-RIGHT: #7b9ebd 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #7b9ebd 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#cecfde); BO
欢醉
2018/01/22
2.3K0
利用GDI+制作背景颜色淡入淡出效果的按钮
用过QQ2009的网友都知道QQ主面板的界面非常炫丽,特别好看,鼠标移上去还有淡入淡出的效果。那这样效果是怎么做出来的呢?其实不难,只要自定义一个用户控件的外怪就可以了,用到GDI+技术和时钟控件来操作…
SAP梦心
2022/05/09
1.1K0
巧用layer-list实现按钮背景阴影、投影
我们在实现UI标注画图的时候难免会遇到要求按钮带阴影的效果。很多人会想,现在安卓5.0以上原生控件已经支持android:elevation=""属性设置投影了,再者也可以使用CardView给需要投影的布局控件来包一层,因为CardView也是带app:cardElevation=""属性的,设置投影还不是分分钟的事。 当我在实际开发中时,项目需求几乎所有的控件按钮都是带阴影的,列表项、详情项等等,如果使用切图肯定是不大现实的,占用空间太大。当我使用上面提到的android:elevation=""与ap
木溪bo
2019/07/28
2.5K0
自定义UITabBar--实现类似新浪微博中间的发送按钮
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/52710240
用户1451823
2018/09/13
6510
Xamarin.Forms 按钮样式 圆角按钮
在 Xamarin 中可以方便进行样式定义或不进行定义样式只修改属性而改变外观,如按钮的圆角可以通过 CornerRadius 属性设置
林德熙
2020/12/07
3.3K0
freemarker文件下,bootstrap 点击按钮,切换按钮上的图标
fa标签在bootstrap封装的原形是:使用一个单<i>并增加对应的CSS类名,例: <i class="fa fa-search"></i>
全栈程序员站长
2022/06/30
3.7K0
点击按钮背景变灰色,松开恢复原来色
最初的时候我是想用js逻辑去修改样式,如果点击了,那么就改为灰色,松开后,再改为白色。结果demo有100多个列表项,我也不可能加上100多个监听,我突然想起以前学的事件代理,然后就实践了一把。出现了如下代码
砖业洋__
2023/05/06
5220
点击加载更多

相似问题

舵图在不同的命名空间中创建秘密

120

如何为子舵图设置不同的命名空间?

17

舵图覆盖值

19

舵图未取正确值

11

修改气流舵图值

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档