Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Redux Observable-如果下一个请求的参数与当前请求的参数相同,则取消该请求,但在参数不同时让其运行_Reactjs_Redux_Rxjs_Reactive Programming_Redux Observable - Fatal编程技术网

Reactjs Redux Observable-如果下一个请求的参数与当前请求的参数相同,则取消该请求,但在参数不同时让其运行

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,则不会将任何内容传递给减缩

我不熟悉反应式编程。只是试着理解可观测值和rxjs操作符。我有一个
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
,它将取消上一个请求,即使它有不同的电影ID
exhaustMap
不会运行下一个请求,即使它具有不同的电影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时,它是否会取消第二个请求,但如果它不同,就让它运行。但就像我说的,我对反应式编程真的很陌生。所以我可能会理解它的运算符是错误的:)我将尝试再次答复。谢谢我建议你先去掉过滤器来简化测试,排气图的表现是它将跳过所有源可观测排放,直到内部可观测完成。