因此,我正在使用不可变对象(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/