【问题标题】:redux-observable error provided "false" where a stream was expectedredux-observable 错误在预期流的地方提供了“假”
【发布时间】:2023-03-23 04:51:01
【问题描述】:

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

【问题讨论】:

    标签: reactjs react-native rxjs observable redux-observable


    【解决方案1】:

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

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

    您将布尔值作为参数传递给takeUntilwhich expects an Observable

    public takeUntil(notifier: Observable): Observable

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

    .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——你可以认为“它只是工作,因为我们与他们合作”。

    但是,您可能只想在您的史诗收到的商店中使用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)
    )
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 2021-12-10
      相关资源
      最近更新 更多