我有像这样的文件史诗(redux-observable):
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 :(得分:0)
问题实际上与您的switchMap
无关,而是takeUntil
.takeUntil(store.getState().currentPeriod !== PERIOD_ONE_DAY)
您将布尔值作为参数传递给takeUntil
,which expects an Observable!
public takeUntil(notifier:Observable):Observable
虽然在商店状态变为特定值之前采用相当复杂的方式来获取流,但实际上我已经发现它们是反模式。相反,请倾听操作,它描述了改变该状态的意图,无论该操作是什么。
.takeUntil(
action$
.ofType(CHANGE_PERIOD)
.filter(action => action.currentPeriod !== PERIOD_ONE_DAY)
)
如果你真的想要获得一个状态流,一种方法是创建它并将其注入你的所有史诗中。这需要最新版本的redux-observable,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)
的最后一部分是因为Redux的商店支持Symbol.observable
- 您可以只考虑&#34;它只是有效,因为我们与他们合作&#34 ;
但是,你可能想在你的史诗收到的商店中使用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)
)
目前尚不清楚哪种方法更多&#34;正确&#34;。状态流肯定更容易,但我有一些耦合和时间问题阻止我实际将它包含在redux-observable中。我也非常担心它是一个步枪 - 这样做很容易做坏事。