【问题标题】:Can't get takeUntil to cancel the request无法获取 takeUntil 来取消请求
【发布时间】:2018-10-24 20:35:05
【问题描述】:

在调度SEARCH 之后,我试图取消一个 AJAX 请求,同时也保持可观察的监听。我正在使用takeUntil 并等待CLEAR_SEARCH_RESULTS 类型的操作来取消请求。

这是我的史诗:

const searchEpic = action$ =>
    action$.ofType(SEARCH).pipe(
        debounceTime(500),
        switchMap(({ payload }) =>
            search(query).pipe(
                map(({ response }) => SearchActions.searchSuccess(response)),  // dispatches SEARCH_SUCCESS
                takeUntil(
                    action$.ofType(CLEAR_SEARCH_RESULTS)
                )
            )
        )
    )

编辑:我有一个 Redux 记录器,它按以下顺序输出调度的操作:

  1. SEARCH
  2. SEARCH
  3. SEARCH
  4. SEARCH
  5. CLEAR_SEARCH_RESULTS
  6. SEARCH_SUCCESS

(每个SEARCH 是一个按键)

【问题讨论】:

  • 那么问题出在哪里?有什么错误吗?你现在看起来很好。你怎么知道它没有被取消,或者它不是在请求完成后才出现的。
  • 我已经编辑了我的帖子,请看一下
  • 你看起来不错,所以问题可能出在其他地方。否则制作一个重现问题的演示。
  • 嘿@martin,抱歉回复晚了。这是一个带有演示的仓库:github.com/eyal0803/job-search

标签: redux rxjs redux-observable


【解决方案1】:

我通过将takeUntil 移到switchMap 之外并在其后放置repeat() 来解决它,如下所示:

const searchEpic = action$ =>
    action$.ofType(SEARCH).pipe(
        debounceTime(500),
        switchMap(({ payload }) =>
            search(query).pipe(
                map(({ response }) => SearchActions.searchSuccess(response))
            )
        ),
        takeUntil(action$.ofType(CLEAR_SEARCH_RESULTS)),
        repeat()
    )

问题在于,epic 仅在 debounceTime 的 500 毫秒后才开始监听 CLEAR_SEARCH_RESULTS,这不是我想要的。

所有功劳归于this answer Jay PhelpsEvert BouwGitter 上找到并指出给我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2018-07-25
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多