RxJS:有无操作可观察吗?

时间:2017-04-18 14:21:53

标签: rxjs redux-observable

我有一个动作然后会触发ajax请求。

如果由于某种原因动作失败,我想什么都不做。而不是创建只返回先前状态的空白操作,是否有可以执行的无操作功能?

export default function fetchMeetups(action$) {
  return action$.ofType(statusActions.START_APP)
    .mergeMap(action =>
      ajax.getJSON(`${config.API_BASE_URL}/api/v1/meetups`)
      .map(meetups => calendarActions.meetupsReceived(meetups))
    )
    .catch(error => Observable.noop())
};

我已经在应用程序上次打开时保存了会面(使用redux-persist),所以如果api请求失败,我只是希望它什么都不做。

这可能吗?

我是从Rxjs发现的,但我不知道如何使用它:https://xgrommx.github.io/rx-book/content/helpers/noop.html

2 个答案:

答案 0 :(得分:10)

抬头:指向xgrommx的链接引用RxJS v4,而不是v5或v6。 noop也只是一个什么都不做的功能 - 不是一个什么都不发出的Observable,这是我相信你正在寻找的。

那就是说,我会非常劝阻完全像这样的吞咽错误。它可以在以后非常努力地调试这个和其他事情。我至少会记录错误信息。

v5附带import { empty } from 'rxjs/observable/empty';mergeMap,它会生成一个Observable,它不会发出任何内容并立即完成。

然而,您可能会遇到其他一些细微之处。如果你让ajax错误传播到mergeMap之外的外部运算符链,你的Epic将不会再监听将来的行为了!相反,您希望尽早捕获错误,在这种情况下,将捕获放在export default function fetchMeetups(action$) { return action$.ofType(statusActions.START_APP) .mergeMap(action => ajax.getJSON(`${config.API_BASE_URL}/api/v1/meetups`) .map(meetups => calendarActions.meetupsReceived(meetups)) .catch(e => { console.error(e); return Observable.empty(); }) ); }; 内。我们经常称之为“隔离我们的观察者链”#34;

empty()

现在,每当ajax(或map操作)出错时,我们会在传播之前捕获该错误,而是切换到我们的空Observable,它将立即完成,因此内链现在已经完成了"完成& #34;但我们的史诗将继续倾听未来的行动。

更新:

在第6版中import { empty } from 'rxjs';是从根import { EMPTY } from 'rxjs';导入的,或者也可以作为单身empty()使用,可以按原样使用,不要将其称为就像你会empty()一样。它可以被重用,因为Observable是懒惰的,无论如何都像工厂一样,所以import { EMPTY } from 'rxjs'; import { catchError } from 'rxjs/operators'; // etc source$.pipe( catchError(e => { console.error(e); return EMPTY; // it's not a function, use it as-is. }) ); 是多余的。

angularjs-viewhead

答案 1 :(得分:0)

由于rxjs也接受数组,因此当您不想发出任何内容时,可以简单地提供一个空数组

...
.catch(error => return [];)