2017-04-24 52 views
0

我有文件史詩(終極版看到)這樣的:終極版,可觀察到的錯誤的流預計

export const intervalChartEpic = (action$, store) => 
action$.ofType(FETCHING_CHART_DATA_ONE_DAY_SUCCESS) 
    .filter(() => (store.getState().currentPeriod === PERIOD_ONE_DAY)) 
    .mergeMap(() => Observable 
    .interval(10000) 
    .takeUntil(store.getState().currentPeriod !== PERIOD_ONE_DAY) 
    .switchMap(() => ajax.getJSON(updateChartOneDayUrl(store)) 
    .map(response => fetchIntervalChartDataSuccess(response)) 
    .catch((err) => { 
     console.log('============Position 1============'); 
     console.log(err); 
     return Observable.of(fetchChartDataFailure(err)); 
    }) 
    ) 
    .catch((err) => { 
     console.log('============Position 2============'); 
     console.log(err); 
     return Observable.of(fetchChartDataFailure(err)); 
    }); 
); 

,並將其與錯誤出來像

"You provided 'false' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable." 

錯誤在位置2,它意味着錯誤在switchMap()功能,我不知道爲什麼,這裏的任何機構可以幫助我??? ???,非常感謝!

回答

0

的問題實際上不是與你switchMap,這是你的takeUntil

.takeUntil(store.getState().currentPeriod !== PERIOD_ONE_DAY) 

你傳遞一個布爾值作爲參數takeUntilwhich expects an Observable

公共takeUntil(通知:可觀察):可觀察

雖然有相當複雜的方式採取流,直到店內的狀態更改爲特定值,在實踐中我已經到目前爲止發現他們是反模式。相反,請傾聽動作,其中描述了更改該狀態的意圖,無論該操作如何。

.takeUntil(
    action$ 
    .ofType(CHANGE_PERIOD) 
    .filter(action => action.currentPeriod !== PERIOD_ONE_DAY) 
) 

如果你真的想要,而不是得到國家流,這樣做就是去創造它,並將它注入到所有的史詩的一種方式。這需要最新版本的終極版,可觀察到的,further documented here

注入依賴,你可以使用createEpicMiddleware的dependencies配置選項

const state$ = new BehaviorSubject(); 

const store = createStore(
    applyMiddleware(
    createEpicMiddleware(epic, { 
     dependencies: { state$ } // <-- this is important 
    }) 
) 
); 

Observable.from(store).subscribe(state$); 

的最後一部分,我們創建一個Observable.from(store)是因爲終極版的商店支持你可以認爲「這只是因爲我們與他們合作的原因」。

然而,你可能會只使用Observable.from(store)對您的史詩獲得的第二個參數,但商店這是行不通的,因爲它不是真正完整的存儲對象! Read more about why here

你新注入的state$流現在是在第三個參數的目的是,你的史詩

// third argument is object of dependencies vvvvvvvv 
const intervalChartEpic = (action$, store, { $state }) => 

而且你可以使用這樣的:

.takeUntil(
    state$.filter(state => state.currentPeriod !== PERIOD_ONE_DAY) 
) 

目前還不清楚哪種方法更「正確」。狀態流當然比較容易,但是我有一些耦合和時序方面的問題,使我無法將它納入可重構的可觀測狀態。我最擔心的是它成爲了一把獵槍 - 這使得它很容易做壞事。

+0

感謝兄弟,它幫助我很多 –