gpt4 book ai didi

rxjs - RxJS:有没有观察到的东西?

转载 作者:行者123 更新时间:2023-12-04 17:07:24 27 4
gpt4 key购买 nike

我有一个 Action ,然后将触发一个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

最佳答案

请注意:指向xgrommx的链接引用了RxJS v4,而不是v5或v6。 noop只是一个什么都不做的函数-不是一个不发出任何东西的Observable,这就是我相信您正在寻找的东西。

就是说,我极力劝阻完全不要像这样吞下错误。以后可能很难调试该功能和其他功能。我至少会注销错误消息。

v5带有Observable.empty()import { empty } from 'rxjs/observable/empty';,它们产生一个Observable,将不会发出任何信号,并且立即完成。

但是,您可能还会遇到其他一些细微之处。如果让ajax错误传播到mergeMap之外的外部运算符(operator)链,则您的Epic将不再监听 future 的 Action !相反,您将希望尽早捕获错误,在这种情况下,请将捕获放置在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();
})
);
};

现在,每当ajax(或map操作)发生错误时,我们都在捕获错误之前将其传播出去,而是切换到我们的空Observable,它将立即完成,因此内链现在“完成”了,但我们的Epic将继续监听为将来的行动。

更新:

在v6中, empty()是从根 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.
})
);

关于rxjs - RxJS:有没有观察到的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43474845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com