2017-07-27 3 views
0

私は、2つの非同期リクエストを持ってpromise.all()redux-observable、promise.all()のような演算子のやり方は?

const fetchData1 =() => (action$: ActionsObservable<any>, store: any) => (
    ajax.getJSON('../../mockData/promiseAll/data1.json').map((data: any) => { 
    return requestData1Success(data); 
    }) 
); 
const fetchData2 =() => (action$: ActionsObservable<any>, store: any) => (
    ajax.getJSON('../../mockData/promiseAll/data2.json').map((data: any) => { 
    return requestData2Success(data); 
    }) 
) 

const requestAllDataEpic = (action$: ActionsObservable<any>, store: any) => { 
    return action$.ofType(t.REQUEST_ALL_DATA) 
    .map((action) => action.payload) 
    .switchMap((names: string[]) => { 
     console.log(names); 

     return Observable.forkJoin([ 
     fetchData1()(action$, store), 
     fetchData2()(action$, store) 
     ]) 
     .map((results: any[]) => { 
      const [action1, action2] = results; 
      requestData1Success(action1); 
      requestData2Success(action2); 

     }); 
    }); 
}; 

のような仕事をするしかし、私はアクションをディスパッチするとき、コンソールは私にエラーを与える叙事詩を書きたい:

Uncaught TypeError: Cannot read property 'type' of undefined

私は思います理由は、私はミドルウェアにactionオブジェクトを与えていませんが、undefinedです。

これを正しく行うにはどうすればよいですか?提供された例で

答えて

0

、あなたが実際にあなたが何も返さないしている、あなたの二つの動作を返すされていません:1 1ではない:それは1ですので、

.map((results: any[]) => { 
    const [action1, action2] = results; 

    // v----- not returning either of these 
    requestData1Success(action1); 
    requestData2Success(action2); 
}); 

mapは順次2つのアクションを放出するために使用することはできません多くの(mergeMap、switchMap、concatMapなどは1:manyです)。しかし、あなたの例では、すでにレスポンスをあなたのfetchDataヘルパーの中のアクションに変換しています。もう一度やり直すと、あなたが望むものではなく、別のアクションの中にアクションがラップされます。これはリファクタリング時のバグのようです。

それ以外は、あなたが意図したことが実際にはっきりしていません。さらに質問がある場合は、達成したいことを説明する必要があります。

関連する問題