javascript - rxjs 限制获取直到请求完成

标签 javascript rxjs redux-observable

我有一个 Observable,它发出一个请求,每次都会返回一些不同的信息。用户单击按钮即可调用此可观察量。我想阻止用户在请求返回信息之前单击此按钮,并且在请求返回后,允许用户再次单击以进行更新。

这是不会在任何时候停止用户的请求。

const fetchRepos = () =>
  fetch( 'https://api.github.com/search/repositories?q=+language:javascript&sort=updated&order=desc')
    .then(response => response.json())

export function fetchReposEpic(action$: any) {
  return action$.ofType(FETCH_POPULAR_REPOS_REQUEST)
    .switchMap(fetchRepos)
    .map(data => ({
      type: FETCH_POPULAR_REPOS_SUCCESS,
      payload: data.items
    }))
}

一种解决方案是在 Observable 开始后限制用户 500 毫秒

export function fetchReposEpic(action$: any) {
  return action$.ofType(FETCH_POPULAR_REPOS_REQUEST)
    .throttleTime(500)
    .switchMap(fetchRepos)
    .map(data => ({
      type: FETCH_POPULAR_REPOS_SUCCESS,
      payload: data.items
    }))
}

这里的问题是我只是估计请求可能需要多长时间,更糟糕的是,如果请求在此时间之前完成,用户可以单击该按钮,并且该单击将被忽略。

最接近我的解决方案是将获取 promise 传递给 throttle 。

export function fetchReposEpic(action$: any) {
  return action$.ofType(FETCH_POPULAR_REPOS_REQUEST)
    .throttle(fetchRepos)
    .map(data => ({
      type: FETCH_POPULAR_REPOS_SUCCESS,
      payload: []
    }))
}

这将等到请求完成,并限制在此之前的所有其他操作。问题是我不知道如何获取throttle的返回值。全部throttle examples我还可以发现显示被丢弃的 throttle 的返回值。

总而言之,我想要一种方法来等到可观察对象完成后再再次触发它。

最佳答案

解决方案是让你的 UI 根据 redux 中的某些状态禁用该按钮,例如 isFetchingRepos你的 reducer 会将其翻转为 trueFETCH_POPULAR_REPOS_REQUEST已收到并 falseFETCH_POPULAR_REPOS_SUCCESS是。

如果您稍后添加错误处理,请确保将其翻转回 false当看到错误操作时。

文档中的 ping/pong 示例实际上基本相同 https://redux-observable.js.org/docs/basics/Epics.html#a-basic-example 。如何在存储中构建/存储该状态取决于您——对于涉及 ID 且可能发生并发请求的更复杂情况,您需要确保状态是每个请求(或 ID,如果使用 switchMap)

关于javascript - rxjs 限制获取直到请求完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44667352/

相关文章:

javascript - 为什么我的 HTML 按钮不能运行我的 JavaScript 函数?

javascript - 如何重新发出主题的最后一个值

javascript - 使用 redux-observable 中的史诗对两个 Action 进行排序

javascript - 如何在 RxJS mergeMap 中包含条件和非条件调用?

rxjs - 如何测试无法完成的内部 Observable?

javascript - jquery ajax搜索加载动画不停

javascript - 用大小写转换替换javascript

javascript - 如何防止 Google Polymer 更改 event.target?

javascript - RxJS 和 Busboy

angular - RxJS 6 - 取消/结束管道