RX.JS Redux Observable 同时发出多个 Get 请求
RX.JS Redux Observable Multiple Get requests at same time
我正在尝试设置一个当前接收位置 ID 数组的可观察对象,然后立即对所有这些发出获取请求并等待对它们的响应。这是一个示例:
const fetchPhotosEpic = action$ =>
action$.ofType(LOCATIONS_RECEIVED)
.map(action => action.payload)
.mergeMap((data) => {
let promiseArray = data.map(location => Observable.fromPromise(axios.get(photosUrl(location.id))))
return Observable.forkJoin(
promiseArray
)
})
.map(responses => responses.map((response) => response.data.location))
数据看起来像:
[
{
id: "aoeuaeu",
name: "Test"
},
...
]
我现在遇到的问题是我收到了一个请求的 404,它把一切都搞砸了。我可能做错了什么,因为我只是在学习 RX。任何帮助都会很棒!
您可以尝试为每个调用添加一个 catch 并返回一个带有错误消息的新 observable,如果一个请求失败,这应该会阻止 forkJoin 失败。然后,您可以过滤掉故障,或添加逻辑以在最终的 .map 中处理它们。例如
const fetchPhotosEpic = action$ =>
action$.ofType(LOCATIONS_RECEIVED)
.map(action => action.payload)
.mergeMap((data) => {
let promiseArray = data.map(location => {
return Observable.fromPromise(axios.get(photosUrl(location.id)))
.catch(error => Observable.of({error}))
})
return Observable.forkJoin(
promiseArray
)
})
.filter(response => !Boolean(response.error))
.map(responses => responses.map((response) => response.data.location))
我正在尝试设置一个当前接收位置 ID 数组的可观察对象,然后立即对所有这些发出获取请求并等待对它们的响应。这是一个示例:
const fetchPhotosEpic = action$ =>
action$.ofType(LOCATIONS_RECEIVED)
.map(action => action.payload)
.mergeMap((data) => {
let promiseArray = data.map(location => Observable.fromPromise(axios.get(photosUrl(location.id))))
return Observable.forkJoin(
promiseArray
)
})
.map(responses => responses.map((response) => response.data.location))
数据看起来像:
[
{
id: "aoeuaeu",
name: "Test"
},
...
]
我现在遇到的问题是我收到了一个请求的 404,它把一切都搞砸了。我可能做错了什么,因为我只是在学习 RX。任何帮助都会很棒!
您可以尝试为每个调用添加一个 catch 并返回一个带有错误消息的新 observable,如果一个请求失败,这应该会阻止 forkJoin 失败。然后,您可以过滤掉故障,或添加逻辑以在最终的 .map 中处理它们。例如
const fetchPhotosEpic = action$ =>
action$.ofType(LOCATIONS_RECEIVED)
.map(action => action.payload)
.mergeMap((data) => {
let promiseArray = data.map(location => {
return Observable.fromPromise(axios.get(photosUrl(location.id)))
.catch(error => Observable.of({error}))
})
return Observable.forkJoin(
promiseArray
)
})
.filter(response => !Boolean(response.error))
.map(responses => responses.map((response) => response.data.location))