redux-observable错误提供了“false”,其中预期了一个流

时间:2017-04-24 04:42:25

标签: reactjs react-native rxjs observable 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."

位置2的错误,这意味着switchMap()功能上的错误,我不知道为什么,这里的任何人都可以帮助我吗???,非常感谢!!!

1 个答案:

答案 0 :(得分:0)

问题实际上与您的switchMap无关,而是takeUntil

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

您将布尔值作为参数传递给takeUntilwhich 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中。我也非常担心它是一个步枪 - 这样做很容易做坏事。