2017-04-24 67 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

感谢兄弟,它帮助我很多 –