2017-04-24 2 views
0

이 같은 파일 서사시 (REDUX-관찰)이 있습니다REDUX-관찰 오류

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() funtion에서 오류가 발생했으며 그 이유는 모르겠지만 여기 어떤 신체도 나를 도울 수 있습니까 ???, 너무 감사합니다 !!!

답변

0

문제는 당신 switchMap에 실제로 아니다, 그건 당신의 takeUntil

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

당신은 takeUntil, which expects an Observable에 인수로 부울을 전달하는!

공공 takeUntil (신고자 : 관찰 가능한) : 실제로 특정 값으로 상점의 상태가 변경 될 때까지 스트림을하는 매우 복잡한 방법이 있지만

관찰 가능한, 나는 지금까지했습니다 그 (것)들을 반대로 본 ㄴ다는 것을 찾아 냈다. 대신, 해당 동작이 무엇이든 그 상태를 변경하려는 의도를 설명하는 조치을 수신하십시오.


당신이 진정으로 대신 상태의 흐름, 그것을 만들고 모든 서사시에 주입하는 일을 한 가지 방법을 얻고 싶은 경우에

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

. 이 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) 
) 

그것은 어떤 방식 불분명 더 "올바른"것입니다. 상태의 흐름은 분명 더 쉬울 지 모르지만 필자는 필자가 실제로 볼 수 없도록 관찰 할 수 없도록하는 몇 가지 커플 링 및 타이밍 문제를 가지고 있습니다. 나는 또한 그것이 발걸음 인 것에 대해 대부분 걱정하고 있습니다. 나쁜 일을 그렇게 쉽게하는 것입니다.

+0

고마워, 나에게 많이 도움이된다. –