【发布时间】:2019-02-02 02:12:34
【问题描述】:
我现在一直在为这段代码苦苦挣扎,通过 stackoverflow 和文档在线搜索,但有些东西我只是没有得到......
我基本上是在使用带有 thunk 的 react redux。这是代码:
export function initializeApp(){
return function (dispatch, getState){
console.log(getState().weekending.weekending);
const promisesArray = stateConfig.charts.map(option=>{
return ()=> new Promise(resolve=>{
()=>dispatch(getChart(option,getState().weekending.weekending))
resolve()}
)
});
const delay = (ms) => new Promise(resolve =>
setTimeout(resolve, ms)
);
console.log(promisesArray);
return Promise.all(
promisesArray
).then(delay(10000)
).then(()=>{console.log(getState().charts)}
)
// .then(()=>dispatch(appLoaded()))
}
}
我正在尝试创建一组需要同时执行的操作。我用 redux thunk 阅读,你可以使用 Promise.all。我正在创建一个调度函数数组,它运行 getChart,它基本上是一个提取图表的数据点并将其放入存储的操作。 要执行的函数数量基于 stateConfig.charts 数组,该数组包含拉动图表所需的所有数据以及每个单独图表的选项。
当我这样做时,它以某种方式永远不会调度函数,我不知道为什么。如果我以任何方式更改代码,我会得到: 1) dispatch(...).then 不是一个函数 2) 错误:动作必须是普通对象。使用自定义中间件进行异步操作。
我认为这里有一些基本的东西我没有掌握。
感谢任何帮助。
Ml,文森特
编辑: 在我得到帮助之后,我得到了这样的结果:
function appLoaded(dispatch){
return new Promise(resolve=>{
dispatch({type: ActionTypes.APP_LOADED});
resolve();
})
}
function getChart(options,weekending,dispatch){
return new Promise((resolve,reject)=>{
const {controller, action, payload } = options;
payload.weekending = weekending;
const SocketConnection = {controller,action,payload};
console.log(SocketConnection)
socket.emit(SocketRequest, SocketConnection, (data) => {
const dataPoints = data.map((row,index)=>{return{x:index, label:row.name, y:timeToDecimal(row.value), labelValue: row.value, id:row.id }})
const payload = {
...options, data: {...options.data.primary, dataPoints,}
}
dispatch({type: ActionTypes.ADD_CHART, payload});
resolve();
})
})
}
export function initializeApp(){
return function (dispatch, getState){
const promisesArray = stateConfig.charts.map(option=>getChart(option,getState().app.weekending,dispatch))
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
return Promise.all(
promisesArray
).then(appLoaded(dispatch)
).then(()=>delay(3000)
).then(()=>{console.log(getState().charts)}
).then(()=>{console.log(getState().app)}
)
}
}
【问题讨论】:
-
getChart是做什么的?具体来说,它返回了什么? -
在调度动作时不能做任何异步操作。如果你想做异步操作,中间件有很多可用的选项。例如 redux-thunk 和 redux-saga 是 reactjs 中著名的异步操作库。供您参考github.com/reduxjs/redux-thunk 或redux-saga.js.org
-
getChart 从数据库中拉取一系列数据点,然后生成图表所需的所有选项(使用canvasjs),然后返回一个可以归约到存储中的对象。
-
@kumar ,我正在使用 redux-thunk,这正是我要在这里解决的问题,如何使用它来完成我想要的。
-
@VincentRye 所以它同步返回一个动作?像
{ type: 'getChart', payload: 'somePieceOfData' }这样的对象?如果你直接调用你想做的任何异步的东西,那会更容易,异步的东西会返回一个承诺。
标签: javascript reactjs redux redux-thunk