gpt4 book ai didi

javascript - RxJS 捕获 **并** 重试 Observable

转载 作者:数据小太阳 更新时间:2023-10-29 04:08:52 25 4
gpt4 key购买 nike

我的用例是将 Observable 映射到成功和失败的 redux 操作。我进行网络调用(具有提供 promise 的功能),如果成功,我必须转发成功操作,如果失败则不是错误操作。 Observable 本身将继续运行。对于我所能搜索到的所有内容,RxJS 没有一种机制可以捕获错误并重试原始错误。我的代码中有以下我不满意的解决方案:

error$ = new Rx.Subject();

searchResultAction$ = search$
.flatMap(getSearchResultsPromise)
.map((resuls) => {
return {
type: 'SUCCESS_ACTION',
payload: {
results
}
}
})
.retryWhen((err$) => {
return err$
.pluck('query')
.do(error$.onNext.bind(error$));
});

searchErrorAction$
.map((query) => {
return {
type: 'ERROR_ACTION',
payload: {
query,
message: 'Error while retrieving data'
}
}
});

action$ = Observable
.merge(
searchResultAction$,
searchErrorAction$
)
.doOnError(err => console.error('Ignored error: ', err))
.retry();

action$.subscribe(dispatch);

也就是说,我创建了一个主题,并将错误推送到该主题中,并从中创建了一个包含错误操作的 Observable。

在我缺少的 RxJS 中,是否有更好的替代方案?基本上我想发出发生错误的通知,然后继续 Observable 已经在做的事情。

最佳答案

这将重试失败的查询:

var action$ = search$
.flatMap(value => {
// create an observable that will execute
// the query each time it is subscribed
const query = Rx.Observable.defer(() => getSearchResultsPromise(value));

// add a retry operation to this query
return query.retryWhen(errors$ => errors$.do(err => {
console.log("ignoring error: ", err);
}));
})
.map(payload => ({ type: "SUCCESS_ACTION", payload }));

action$.subscribe(dispatcher);

如果不想重试,只想通知或忽略错误:

var action$ = search$
.flatMap(value => {
// create an observable that will execute
// the query each time it is subscribed
const query = Rx.Observable.defer(() => getSearchResultsPromise(value));

// add a catch clause to "ignore" the error
return query.catch(err => {
console.log("ignoring error: ", err);
return Observable.empty(); // no result for this query
}));
})
.map(payload => ({ type: "SUCCESS_ACTION", payload }));

action$.subscribe(dispatcher);

关于javascript - RxJS 捕获 **并** 重试 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33893425/

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