2016-12-01 82 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对象。 –