首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Monix Observable处理错误的更好方法

使用Monix Observable处理错误的更好方法
EN

Stack Overflow用户
提问于 2019-04-10 21:43:51
回答 2查看 266关注 0票数 2

我正在尝试使用monix 3.0.0-RC1构建反应式应用程序。

例如,a有一个Int的序列,而第二个元素是错误的。我可以使用Oservable.raiseError(...)来处理这个问题:

代码语言:javascript
复制
  Observable.fromIterable(Seq(1,2,3))
    .flatMap( i =>
      if (i == 2) Observable.raiseError(new Exception("Wrong i"))
      else Observable.pure(i)
    )
    .doOnNext(i => println(s"Processing $i"))
    .foreachL(i => println(s"Finished $i"))
    .onErrorHandle(_ => Task.unit)

我不喜欢在上面的代码中抛出异常。

另一方面,我可以使用Scala的Either

代码语言:javascript
复制
Observable.fromIterable(Seq(1,2,3))
  .map( i =>
    if (i == 2) Left("Wrong i")
    else Right(i)
  )
  .doOnNext(either => either.map( i => println(s"Processing $i") ))
  .foreachL(either => either.map( i => println(s"Finished $i") ))

但是either => either.map(...)的每一步都不酷。

处理错误的更好方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-16 14:47:40

如果你只关心正确的结果,你可以使用collect

代码语言:javascript
复制
val logError = {
  case Right(_) => Task.unit
  case Left(i) => Task.delay(println(s"An error occured $i"))
}

Observable.fromIterable(Seq(1,2,3))
  .map( i =>
    if (i == 2) Left("Wrong i")
    else Right(i)
  )
  .doOnNext(logError)
  .collect {
    case Right(value) => value
  }
  .foreachL(i => println(i))
票数 4
EN

Stack Overflow用户

发布于 2019-12-24 15:56:57

如果你想drop坏的元素,你可以这样做。

代码语言:javascript
复制
Observable.fromIterable(1 to 3)
      .mapEval(p => { if(i == 2) Task.raiseError(new Exception) 
                      else Task.now(i)
                    }.attempt )
      .collect { case Right(v) => v }
      .foreachL(println)
      .runToFuture

/*
1
3
*/

基本上继续使用任务和attempt来将任务组合转换为TaskEither。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55614149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档