rxjs限制取消,直到请求完成

时间:2017-06-21 05:18:19

标签: 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
    }))
}

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

最接近我的解决方案是将获取承诺传递给油门。

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

这将等到请求完成并将在此之前限制所有其他操作。问题是我不知道如何获得油门的返回值。我能找到的所有throttle examples也显示了丢失油门的返回值。

总而言之,我希望有一种方法可以等到观察者完成之后再重新关闭它。

1 个答案:

答案 0 :(得分:0)

解决方案是让您的用户界面根据redux中的某些状态禁用该按钮,例如isFetchingRepos,并且当收到true并且{{1}时,您的缩减器会将其翻转为FETCH_POPULAR_REPOS_REQUEST } false时。

如果您以后添加错误处理,请确保在看到错误操作时将其翻转回FETCH_POPULAR_REPOS_SUCCESS

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