如何格式化 RxJS redux observable epic 来做很多事情?
How to format RxJS redux observeable epic to do many things?
这是我此刻的史诗
export const listenToNewDataAdded = (action$, store) =>
action$.pipe(
ofType('FIRED_ACTION'),
mergeMap((action) => {
if (store.value.user === 1) {
const someData = {data: 'data'}
ajax.post(
url,
someData,
{ 'Content-Type': 'application/json' },
)
return [addNotification(someData)]
}
if (store.value.user === 2) {
const someData = {data2: 'data2'}
return [addNotification(someData)]
} else {
return EMPTY
}
catchError((error) => console.log('e:', error))
}),
)
我有几个问题。首先,如何在 RxJS 中正确发出 ajax 请求?我正在导入正确的模块,但它没有触发。我想我看到一些文档说 return 它隐含地 return 但是我不能 运行 下面的代码?
其次,catchError
表示无法访问代码。这是有道理的,因为我有所有 returns 涵盖上述情况,但我如何捕获错误?文档说确保你在 mergeMap
中捕获它,否则如果你在管道中捕获它,那么它将终止史诗
关于如何最好地做到这一点有什么想法吗?
与其将 catchError
RxJS 运算符嵌套在 mergeMap
中,不如将其用作您为 listenToNewDataAdded
史诗设置的可管道运算符的一部分。
此外,在redux-observables中使用catchError
运算符时必须发出一个动作。您可以在 here.
上阅读更多相关信息
这是解决问题的方法:
export const listenToNewDataAdded = (action$, store) =>
action$.pipe(
ofType('FIRED_ACTION'),
mergeMap((action) => {
// handle logic here
}),
catchError((error) => {
console.log('e:', error);
// emit redux action here
return errorHandlerAction;
})
)
export const listenToNewDataAdded = (action$, store) =>
action$.pipe(
ofType('FIRED_ACTION'),
mergeMap((action) => {
if (store.value.user === 1) {
const someData = {data: 'data'}
return ajax.post(
url,
someData,
{ 'Content-Type': 'application/json' },
).pipe(
mapTo([addNotification(someData)])
);
}
if (store.value.user === 2) {
const someData = {data2: 'data2'}
return [addNotification(someData)];
} else {
return EMPTY;
}
}),
// Must return an observable
catchError((error) => of('err'))
);
您之前使用的方式catchError
完全没有效果。它是一个 pipeable operator 并且还要注意传递给它的回调函数 必须 return 一个可观察的 /
I'm importing the right module but it's not firing...
您可以使用其他运算符修改 ajax
编辑的可观察对象 return。它的重要方面是确保您 return observable,以便 mergeMap
可以订阅它并传递它的值。
这是我此刻的史诗
export const listenToNewDataAdded = (action$, store) =>
action$.pipe(
ofType('FIRED_ACTION'),
mergeMap((action) => {
if (store.value.user === 1) {
const someData = {data: 'data'}
ajax.post(
url,
someData,
{ 'Content-Type': 'application/json' },
)
return [addNotification(someData)]
}
if (store.value.user === 2) {
const someData = {data2: 'data2'}
return [addNotification(someData)]
} else {
return EMPTY
}
catchError((error) => console.log('e:', error))
}),
)
我有几个问题。首先,如何在 RxJS 中正确发出 ajax 请求?我正在导入正确的模块,但它没有触发。我想我看到一些文档说 return 它隐含地 return 但是我不能 运行 下面的代码?
其次,catchError
表示无法访问代码。这是有道理的,因为我有所有 returns 涵盖上述情况,但我如何捕获错误?文档说确保你在 mergeMap
中捕获它,否则如果你在管道中捕获它,那么它将终止史诗
关于如何最好地做到这一点有什么想法吗?
与其将 catchError
RxJS 运算符嵌套在 mergeMap
中,不如将其用作您为 listenToNewDataAdded
史诗设置的可管道运算符的一部分。
此外,在redux-observables中使用catchError
运算符时必须发出一个动作。您可以在 here.
这是解决问题的方法:
export const listenToNewDataAdded = (action$, store) =>
action$.pipe(
ofType('FIRED_ACTION'),
mergeMap((action) => {
// handle logic here
}),
catchError((error) => {
console.log('e:', error);
// emit redux action here
return errorHandlerAction;
})
)
export const listenToNewDataAdded = (action$, store) =>
action$.pipe(
ofType('FIRED_ACTION'),
mergeMap((action) => {
if (store.value.user === 1) {
const someData = {data: 'data'}
return ajax.post(
url,
someData,
{ 'Content-Type': 'application/json' },
).pipe(
mapTo([addNotification(someData)])
);
}
if (store.value.user === 2) {
const someData = {data2: 'data2'}
return [addNotification(someData)];
} else {
return EMPTY;
}
}),
// Must return an observable
catchError((error) => of('err'))
);
您之前使用的方式catchError
完全没有效果。它是一个 pipeable operator 并且还要注意传递给它的回调函数 必须 return 一个可观察的 /
I'm importing the right module but it's not firing...
您可以使用其他运算符修改 ajax
编辑的可观察对象 return。它的重要方面是确保您 return observable,以便 mergeMap
可以订阅它并传递它的值。