2017-06-21 53 views
1

我有一個Observable,它提出一個請求,回覆一些每次都不相同的信息。用戶點擊一個按鈕可以調用這個可觀察對象。我想阻止用戶在請求返回信息之前單擊此按鈕,並且一旦它返回,允許用戶再次單擊以進行更新。rxjs油門提取直到請求完成

這是在任何時候都不停止用戶的請求。

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 
    })) 
} 

一種解決方案是可觀察的後油門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

的解決方案是你的UI禁用基於一些國家在終極版的按鈕,像isFetchingRepos和你的減速將翻轉這trueFETCH_POPULAR_REPOS_REQUEST接收並falseFETCH_POPULAR_REPOS_SUCCESS是。

如果您稍後添加錯誤處理,請確保在發現錯誤操作時將其還原爲false

文檔中的ping/pong示例實際上大多是相同的東西https://redux-observable.js.org/docs/basics/Epics.html#a-basic-example。如何在商店中構建/存儲該狀態取決於您 - 對於涉及ID且可能發生併發請求的更復雜情況,您需要確保該狀態是每個請求(或使用switchMap時的ID)

+0

對此有幫助嗎? :) – jayphelps