【问题标题】:How to invoke exception for Subject Observer in map?如何在地图中为主题观察者调用异常?
【发布时间】:2019-01-26 19:48:15
【问题描述】:

我有这个 0bserver 主题:

public subject = new Subject<any>();

我这样推送消息:

this.subject.next({value : 1});

然后我尝试执行以下操作:

this.subject.map(data => {
      if (!data || !data.value) {
        throw new Error('No value, no function...');
      } else {
        return data;
      }
    }).subscribe((data: IFilterCustom) => {
      // WORK HERE WITH FILLED DATA
}, err => {
  console.error('Error');
});

我尝试检查传入数据是否不包含value 我调用异常。该怎么做?

【问题讨论】:

  • 所以,我想确保在订阅结果中我有真实数据可以调用this.subject.next(),这就是为什么我之前尝试在map中检查

标签: angular rxjs angular2-observables


【解决方案1】:

在最新的 rxjs 中,您可以使用管道来执行此操作:

import { map, catchError } from 'rxjs/operators'
import { of } from 'rxjs'

this.subject.pipe(
  map((data) => {
    if (!data || !data.value) {
      throw new Error('No value, no function...');
    } else {
      return data;
    }
  }),
  catchError(() => {
    console.log('Error')
    return of(null) // Be sure to return an observable here! The 'of' function creates an observable out of the argument
  })
)

一旦在 observable 中抛出错误,catchError 部分将被调用。这对于捕获请求中的任何网络错误也很有用。

如果您不需要错误处理并且只需要主题不发出值,那么您可以使用过滤器

import { filter } from 'rxjs/operators'

this.subject.pipe(
  filter((data) => {
    return (data && data.value)
  })
)

【讨论】:

  • 如果return of(null) 出现错误,我不希望订阅者提供价值。不是,如果我使用我 return of(null) 它会进入下面的 subscribe(){}
  • 所以你可能不需要错误处理。在这种情况下,我可以推荐使用 filter 运算符。我会在一分钟内更新我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多