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)

您将布尔值作为参数传递给 takeUntilwhich 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 中。我也最担心的是它是步兵枪——很容易做坏事。