1

我有这样的文件史诗(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()功能上出错,我不知道为什么,这里的任何人都可以帮助我吗???,非常感谢!!!

4

1 回答 1

0

问题实际上不在于你的switchMap,而是你的takeUntil

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

您将布尔值作为参数传递给takeUntil它需要一个 Observable

public takeUntil(notifier: Observable): Observable

虽然有相当复杂的方法可以在商店的状态更改为特定值之前获取流,但实际上我到目前为止发现它们是反模式。相反,请侦听描述更改该状态的意图的操作,无论该操作是什么。

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

如果您真的想获得状态流,一种方法是创建它并将其注入所有史诗。这需要最新版本的 redux-observable,在此处进一步记录

要注入依赖项,您可以使用 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——你可以认为“它只是工作,因为我们与他们合作”。

但是,您可能很想只使用Observable.from(store)您的史诗作为第二个参数接收的商店,但这不起作用,因为它不是真正的完整商店对象!在此处阅读有关原因的更多信息

您新注入的流state$现在将在您的史诗的第三个参数的对象中

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

你可以像这样使用它:

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

目前尚不清楚哪种方法更“正确”。状态流当然更容易,但是我有一些耦合和时间问题,这使我无法将它实际包含在 redux-observable 中。我还主要担心它是一支长枪——让做坏事变得如此容易。

于 2017-04-24T05:11:03.103 回答