javascript - 在 Javascript 中更新不可变数据并返回 Promise

标签 javascript redux immutable.js

因此,我正在使用不可变对象(immutable对象)构建 React-Redux 应用程序,并且需要使用从 API 端点获取的一些数据来更新我的状态。

这是我添加数据之前的状态结构

    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对象)在返回状态之前不会更新(?)。但是,我还返回一个需要解决或拒绝的 promise 。我如何确保状态得到更新并解决 promise 。

我对处理不可变数据结构还比较陌生,所以如果我遗漏了一些明显的东西,请指出。另外,如果使用回调是完成此操作的唯一方法,那也很好。

最佳答案

好吧,我找到了答案。由于某种原因,将数据作为 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);
}

关于javascript - 在 Javascript 中更新不可变数据并返回 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40916920/

相关文章:

JavaScript:DOM 加载事件、执行顺序和 $(document).ready()

javascript - 为什么 Youtube 评论不触发 DOM 突变?

javascript - 如何在 React Redux 中从组件获取事件到容器

javascript - 更新 redux reducer 状态

javascript - 使用 Filter 函数返回 React 组件 - 代码审查

javascript - 从其他对象填充对象中的字段

javascript - 有什么方法可以延迟在 beforeModel Hook 中触发 Embers 模型?

javascript - 用于填充 React 组件中下拉列表的多个 API 调用

record - 使用点符号访问 Immutable.js 记录

javascript - Immutable.js:如何使用 withMutations 同时构建两个数据结构