RxJS:有无操作可观察吗?

big*_*ato 5 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())
};
Run Code Online (Sandbox Code Playgroud)

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

这可能吗?

我从Rxjs找到了这个,但我不知道如何使用它:https://xgrommx.github.io/rx-book/content/helpers/noop.html

jay*_*lps 11

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

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


v5附带Observable.empty()import { empty } from 'rxjs/observable/empty';产生一个Observable,它不会发出任何东西,只是立即完成.

但是,您可能会遇到其他一些细微之处.如果你让ajax错误传播到外部运算符链,那么mergeMap你的Epic将不会再监听未来的行为了!相反,你会希望尽早捕获错误,在这种情况下,将catch放入其中mergeMap.我们经常称之为"孤立我们的观察链"

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();
        })
    );
};
Run Code Online (Sandbox Code Playgroud)

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


更新:

在v6中empty()是从root导入的,import { empty } from 'rxjs';或者它也可以作为单例使用import { EMPTY } from 'rxjs';,可以按原样使用,你不要像你那样调用它empty().它可以重复使用,因为Observables很懒惰,无论如何都像工厂一样,所以empty()是多余的.

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.
  })
);
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供详细信息!有一个问题与此相关。我遇到了一个问题,即在异步函数中返回 Observable.empty() 是在错误“操作必须是普通对象。使用自定义中间件进行异步操作”之后返回的。您是否知道异步函数返回empty() 时的语法应该如何? (2认同)