Я уже давно борюсь с этим фрагментом кода, ищу онлайн через stackoverflow и документы, и есть кое-что, чего я просто не получаю ...
Я в основном использую реагирующий редук с тханком. Это код:
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()))
}
}
Я пытаюсь создать массив действий, которые должны выполняться одновременно. Я читал с избыточным Thunk, вы можете использовать Promise.all. Я создаю массив функций диспетчеризации, который запускает getChart, который в основном представляет собой действие, которое извлекает dataPoints диаграммы и помещает ее в хранилище.
Количество выполняемых функций основано на stateConfig.charts, который является массивом, который содержит все данные, необходимые для извлечения диаграмм, а также параметры каждой отдельной диаграммы.
Когда я делаю это, он как-то никогда не отправляет функции, я не уверен почему. Если я изменю код каким-либо образом, я получу:
1) диспетчеризация (...). Тогда не является функцией
2) Ошибка: действия должны быть простыми объектами. Используйте пользовательское промежуточное ПО для асинхронных действий.
Я думаю, что здесь есть нечто фундаментальное, чего я не понимаю.
Любая помощь приветствуется.
мл, Винсент
EDIT:
После помощи, которую я получил, я закончил с этим:
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)}
)
}
}