2016-12-01 74 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,它將只會暫時更新,因爲在您返回狀態(?)之前,不可變對象不會更新。但是,我也回覆了一個需要解決或拒絕的承諾。我如何確保國家得到更新並解決承諾。

我對處理Immutable數據結構相對比較陌生,所以如果有什麼明目張膽的我不見了,請指出。此外,如果使用回調是完成此操作的唯一方法,那也沒關係。

+1

我強烈建議您投入一小時的時間觀看在redux.js上找到的免費[Redux入門](https://egghead.io/courses/getting-started-with-redux)視頻.org(由Redux的創建者創建)。它真的可以幫助你思考如何減少不可變狀態,而不是直接改變它。 – jehna1

+0

@ jehna1 - 嘿,是的,我已經經歷過這些視頻,我喜歡它們。他們是我決定開始使用Immutable JS的主要原因,因爲它們使得處理redux應用程序數據變得更加容易。但是,他們沒有關於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對象。
  • 無論何時你的應用程序發生了變化,這個邏輯應該發生在它的reducer裏面。在這裏,你看起來是在減速器之外的變異狀態。
  • 當您將異步操作與Redux混合時,您應該可能使用另一個類似Thunk的庫。查看Redux文檔瞭解異步配方。
+0

嘿,好吧,只是爲了清楚我需要清理的代碼是什麼 1)Dispatch接受一個普通的JS不可變對象,它進行一個API調用,然後將這些數據填充到Immutable對象中。這種方法有什麼問題? 2)你是指我使用私人函數來添加API數據到狀態? 3)我正在使用Redux Thunk ... –

+0

嘿,重讀這個我可能有點太苛刻了。如果你發佈了一個GitHub倉庫的鏈接,我很樂意看看。 –

+0

另外,如果dispatch接受一個不可變映射,dispatch不接受一個普通的JS對象。 –