我有一个动作然后会触发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
答案 0 :(得分:10)
抬头:指向xgrommx的链接引用RxJS v4,而不是v5或v6。 noop也只是一个什么都不做的功能 - 不是一个什么都不发出的Observable,这是我相信你正在寻找的。 p>
那就是说,我会非常劝阻完全像这样的吞咽错误。它可以在以后非常努力地调试这个和其他事情。我至少会记录错误信息。
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 [];)