2016-12-01 8 views
0

私はImmutableオブジェクトを使ってReact-Reduxアプリケーションを構築しています。私はAPIエンドポイントから取得したデータで状態を更新する必要があります。私はアイデアは私がフェッチデータはここ不変のデータを更新し、Javascriptで約束を返す

が私のコードであるデータオブジェクト内のそれぞれのティッカー・キーに入るということです

const state = fromJS({ 
     tickers: ['AAPL', 'TSLA', 'GOOGL'], 
     data: { 
      AAPL: Map(), 
      TSLA: Map(), 
      GOOGL: Map() 
     } 
    }); 

データに追加する前に、ここで

は私の状態構造でありますデータを取得して更新してみてください

export function requestAPIData(state, tickerArray){ 
    return dispatch => { 
     return yahooFinance.historical({ 
        symbols: tickerArray, 
        from: '2012-01-01', 
        to: '2012-01-05', 
        period: 'd' 
       }, (err, quotes) => { 
        throw new Error('err'); 
       }).then(result => { 
        addDataToKeysFunction(state, result); 
       }).then(() => { 
        console.log(state); 
        dispatch(success()); 
       }) 
      } 

     } 

function addDataToKeysFunction(state, data){ 
    return new Promise ((resolve, reject) => { 
     for(let key in data){ 
      console.log(data[key]); 
      state.setIn(['data', key], data[key]); 
     } 
     resolve(); 
    }) 
} 

ここで私は混乱しています。状態オブジェクトに対してstate.setInを呼び出すだけでは、状態(?)を返さない限り、不変オブジェクトは更新されないため、一時的に更新されます。しかし、私はまた、解決される必要がある、または拒絶される必要がある約束を返す。状態が更新され、約束が解決されるようにするにはどうすればよいですか。

私は不変のデータ構造を扱うのが比較的新しいので、不明な点がある場合は、それを指摘してください。また、コールバックを使用してこれを行うための唯一の方法である場合、それも同様です。

+1

redux.jsで見つかった無料の[Getting Started with Redux](https://egghead.io/courses/getting-started-with-redux)の動画を見るのに1時間を投資することを強くお勧めします。 .org(Reduxの作成者が作成)。不変状態を直接に変更するのではなく、どのように減らすべきかを考えるのに役立ちます。 – jehna1

+0

@ jehna1 - ねえ、私はそれらのビデオを見てきました、そして、私はそれらを愛しました。私はImmutable JSを使い始めることを主な理由としています。なぜなら、還元型アプリケーションデータの処理がずっと簡単になるからです。しかし、彼らはImmutable JS自体に関する情報を持っておらず、ImmutableのTypeScriptドキュメントも役に立ちません。 –

+1

還元剤を使って状態を変えることについて話しているものに再訪することをお勧めします。 – jehna1

答えて

1

私は答えを見つけました。何らかの理由で、promise呼び出しのresolve()の一部としてデータを返すとエラーが発生しましたが、コールバックで返すのは問題ありません。

export function requestAPIData(state, tickerArray){ 
    return dispatch => { 
     return yahooFinance.historical({ 
        symbols: tickerArray, 
        from: '2012-01-01', 
        to: '2012-01-05', 
        period: 'd' 
       }, (err, quotes) => { 
        throw new Error('err'); 
       }).then(result => { 
        addDataToKeysFunction(state, result, function(return_data){ 
         console.log(return_data); 
        }); 
       }) 
      } 

     } 

function addDataToKeysFunction(state, data, done){ 
    let new_state = state; 
    for(let key in data){ 
     new_state = state.setIn(['data', key], data[key]); 
     state = state.merge(new_state); 
    } 
    done(state); 
} 
0

Reduxの基本的な誤解を率直に示すように見えるコードには、いくつかの問題があります。他の人が私の前に表明したように、私はReduxのドキュメントに戻って時間を費やすことをお勧めします。上記のコードで

いくつかのコメント:

  • 発送はしか(拡張子によっておよび減速)ストアに意思を伝えるプレーンJSオブジェクトを受け入れる必要があります。
  • あなたのアプリがその状態を変えるたびに、そのロジックはそのレデューサー内で発生するはずです。ここでは、減速器の外側にある状態を変えているようです。
  • 非同期アクションをReduxと混在させる場合、おそらくThunkのような別のライブラリを使用しているはずです。非同期レシピについては、Reduxのドキュメントを参照してください。
+0

ちょっと、正確に私のコードできれいにする必要があることを明確にするために 1)ディスパッチは、プレーンなJS可変オブジェクトを受け入れ、API呼び出しを行い、そのデータをImmutableオブジェクトに埋め込みます。このアプローチで何が問題になりますか? 2)APIデータを州に追加する私的な関数を使用していますか? 3)私はRedux Thunkを使用しています... –

+0

ねえ、これを読んでみるとちょっとあまりにも厳しいかもしれません。あなたがGitHubリポジトリへのリンクを投稿すると、私は一目瞭線してください。 –

+0

また、ディスパッチは、不変のマップを受け入れる場合は、プレーンなJSオブジェクトを受け付けません。 –