【发布时间】:2017-06-21 05:18:18
【问题描述】:
我有一个 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
}))
}
这里的问题是我只是估计请求可能需要多长时间,更糟糕的是,如果请求在此时间之前完成,用户可以单击按钮并且单击将被忽略。
我最接近的解决方案是将 fetch 承诺传递给限制。
export function fetchReposEpic(action$: any) {
return action$.ofType(FETCH_POPULAR_REPOS_REQUEST)
.throttle(fetchRepos)
.map(data => ({
type: FETCH_POPULAR_REPOS_SUCCESS,
payload: []
}))
}
这将一直等到请求完成,并在此之前限制所有其他操作。问题是我不知道如何获得油门的返回值。我能找到的所有throttle examples 也显示了油门被扔掉的返回值。
总而言之,我想要一种方法来等到可观察对象完成后再将其触发。
【问题讨论】:
标签: javascript rxjs redux-observable