我有一个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也显示了丢失油门的返回值。
总而言之,我希望有一种方法可以等到观察者完成之后再重新关闭它。
答案 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)