Reactjs Redux Observable-如果下一个请求的参数与当前请求的参数相同,则取消该请求,但在参数不同时让其运行
我不熟悉反应式编程。只是试着理解可观测值和rxjs操作符。我有一个Reactjs Redux Observable-如果下一个请求的参数与当前请求的参数相同,则取消该请求,但在参数不同时让其运行,reactjs,redux,rxjs,reactive-programming,redux-observable,Reactjs,Redux,Rxjs,Reactive Programming,Redux Observable,我不熟悉反应式编程。只是试着理解可观测值和rxjs操作符。我有一个react-redux应用程序,它有一个自定义的中间件来处理缓存数据和isFetching标志。虽然它只处理我需要的事情,但对于取消或取消预订等事情来说可能会很复杂。因此,我想将此应用程序迁移到redux observable 如果当前正在获取相同的电影,我不想获取它。我只是将一个selectIsFetchingMovieById(action.movieId)选择器传递给定制中间件。如果它返回true,则不会将任何内容传递给减缩
react-redux
应用程序,它有一个自定义的中间件来处理缓存数据和isFetching
标志。虽然它只处理我需要的事情,但对于取消或取消预订等事情来说可能会很复杂。因此,我想将此应用程序迁移到redux observable
如果当前正在获取相同的电影,我不想获取它。我只是将一个selectIsFetchingMovieById(action.movieId)
选择器传递给定制中间件。如果它返回true
,则不会将任何内容传递给减缩器。但是,当选择器返回false
时,它将获取电影,并像任何常规的基于承诺的获取数据过程一样,通过.then
或.catch
运行
但是当我使用redux observable
时,给定电影ID的正在获取
状态已经是true
。因为reducer已经获得了({type:FETCH\u MOVIE\u请求,movieId:“10”})
操作。选择器始终返回true
如果我使用switchMap
,它将取消上一个请求,即使它有不同的电影IDexhaustMap
不会运行下一个请求,即使它具有不同的电影ID等
现在我有了这部史诗。它适用于cachedData
情况。如果商店已经有了电影,它将不会继续。但是基于movieId的isFetching
仍然是一个问题
const fetchMovieEpic = (action$, state$) =>
action$.pipe(
ofType(actionTypes.FETCH_MOVIE_REQUEST),
filter(action => {
const cachedData = selectors.selectMovie(state$.value, action.movieId);
return !verifyCachedData(cachedData, action.requiredFields);
}),
map(action => action.movieId),
switchMap(movieId =>
ajax.getJSON(`${BASE_API_URL}/movie/${movieId}?api_key=${api_key}`).pipe(
map(response => normalize(response, schemas.movieSchema)),
map(normalizedData => fetchMovieSuccess(movieId, normalizedData)),
catchError(() => of(fetchMovieError())),
takeUntil(
action$.pipe(
ofType("FETCH_MOVIE_CANCELLED"),
filter(action => action.movieId === movieId)
)
)
)
)
);
我如何使用rxjs操作符或任何其他技术来完成这项工作?我不想添加一个额外的actionType,比如FETCH\u MOVIE\u TOGGLE\u LOADING
。我已经有请求
,成功
,错误
和取消
。还有很多其他的减速器和史诗。因此,对运算符保持简单可能是一个不错的选择:)
谢谢 根据定义
排气图假设有效。您可能可以通过重构流并简化内部流来调试它
exhaustMap(movieId =>ajax.getJSON(`${BASE_API_URL}/movie/${movieId}?api_key=${api_key}`).pipe(catchError(() => of(fetchMovieError()))
),
看看后续操作是否会在请求完成后触发我知道已经有点晚了,实际上我已经放弃使用redux observable。我无法用它编写我想要的代码。这让我觉得它不容易阅读
坚持使用redux thunk并在特殊情况下使用redux saga可能更容易。至少对我来说是这样
以下是我在分组解决方案中使用的最新版本的epics:
我会再试一次,但我不确定当第二个请求与当前正在运行的请求具有相同的电影ID时,它是否会取消第二个请求,但如果它不同,就让它运行。但就像我说的,我对反应式编程真的很陌生。所以我可能会理解它的运算符是错误的:)我将尝试再次答复。谢谢我建议你先去掉过滤器来简化测试,排气图的表现是它将跳过所有源可观测排放,直到内部可观测完成。