redux-observable 错误 "false" 在需要流的位置提供
redux-observable error provided "false" where a stream was expected
我有这样的史诗文件 (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."
Error at Position 2,意思是switchMap()
函数出错,我不知道为什么,这里有哪位大侠能帮帮我吗???,万分感谢!!!
实际上问题不在于您的 switchMap
,而是您的 takeUntil
.takeUntil(store.getState().currentPeriod !== PERIOD_ONE_DAY)
您将布尔值作为参数传递给 takeUntil
、which expects an Observable!
public takeUntil(notifier: Observable): Observable
虽然在商店的状态更改为特定值之前有相当复杂的方法来获取流,但实际上我到目前为止发现它们是anti-patterns.相反,请监听 action,它描述了改变该状态的意图,无论该操作是什么。
.takeUntil(
action$
.ofType(CHANGE_PERIOD)
.filter(action => action.currentPeriod !== PERIOD_ONE_DAY)
)
如果您真的想获取状态流,一种方法是创建它并将其注入您所有的 epics。这需要最新版本redux-observable,further documented here
To inject dependencies you can use createEpicMiddleware's dependencies
configuration option
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
——你可以认为 "it just works cause we worked with them".
但是,您可能会想在您的 epics 收到的商店中使用 Observable.from(store)
作为第二个参数,但是 这行不通 因为它不是真正的完整商店 object! Read more about why here
您新注入的 state$
流现在将位于 epics
的第三个参数的 object 中
// third argument is object of dependencies vvvvvvvv
const intervalChartEpic = (action$, store, { $state }) =>
你可以这样使用它:
.takeUntil(
state$.filter(state => state.currentPeriod !== PERIOD_ONE_DAY)
)
不清楚哪种方法更 "correct"。状态流当然更容易,但我有一些耦合和时序问题阻止我实际将它包含在 redux-observable 中。我也最担心的是它是步兵枪——很容易做坏事。
我有这样的史诗文件 (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."
Error at Position 2,意思是switchMap()
函数出错,我不知道为什么,这里有哪位大侠能帮帮我吗???,万分感谢!!!
实际上问题不在于您的 switchMap
,而是您的 takeUntil
.takeUntil(store.getState().currentPeriod !== PERIOD_ONE_DAY)
您将布尔值作为参数传递给 takeUntil
、which expects an Observable!
public takeUntil(notifier: Observable): Observable
虽然在商店的状态更改为特定值之前有相当复杂的方法来获取流,但实际上我到目前为止发现它们是anti-patterns.相反,请监听 action,它描述了改变该状态的意图,无论该操作是什么。
.takeUntil(
action$
.ofType(CHANGE_PERIOD)
.filter(action => action.currentPeriod !== PERIOD_ONE_DAY)
)
如果您真的想获取状态流,一种方法是创建它并将其注入您所有的 epics。这需要最新版本redux-observable,further documented here
To inject dependencies you can use createEpicMiddleware's
dependencies
configuration option
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
——你可以认为 "it just works cause we worked with them".
但是,您可能会想在您的 epics 收到的商店中使用 Observable.from(store)
作为第二个参数,但是 这行不通 因为它不是真正的完整商店 object! Read more about why here
您新注入的 state$
流现在将位于 epics
// third argument is object of dependencies vvvvvvvv
const intervalChartEpic = (action$, store, { $state }) =>
你可以这样使用它:
.takeUntil(
state$.filter(state => state.currentPeriod !== PERIOD_ONE_DAY)
)
不清楚哪种方法更 "correct"。状态流当然更容易,但我有一些耦合和时序问题阻止我实际将它包含在 redux-observable 中。我也最担心的是它是步兵枪——很容易做坏事。