【问题标题】:React, Redux, ThunkReact、Redux、Thunk
【发布时间】: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-thunkredux-saga.js.org
  • getChart 从数据库中拉取一系列数据点,然后生成图表所需的所有选项(使用canvasjs),然后返回一个可以归约到存储中的对象。
  • @kumar ,我正在使用 redux-thunk,这正是我要在这里解决的问题,如何使用它来完成我想要的。
  • @VincentRye 所以它同步返回一个动作?像{ type: 'getChart', payload: 'somePieceOfData' } 这样的对象?如果你直接调用你想做的任何异步的东西,那会更容易,异步的东西会返回一个承诺。

标签: javascript reactjs redux redux-thunk


【解决方案1】:

我建议您直接执行所需的任何异步操作,而不是尝试调度一系列操作。例如:

function initializeApp(){
  return function (dispatch, getState) {
    const weekending = getState().weekending.weekending;
    const promisesArray = stateConfig.charts.map(option => {
      return doWork(option, weekending);
    })

    Promise.all(promisesArray)
      .then(charts => {
        dispatch(appLoaded(charts))
      })
  }
}


function doWork(option, weekending) {
  // maybe it looks something like this? Substitute with whatever you need to do, 
  //   and make sure to return a promise
  return http.get('someUrlBasedOnOptionAndWeekending')
    .then(response => response.data);
}

【讨论】:

  • 谢谢,这真的很有帮助。最后我得到了一些新代码,我在上面发布了编辑。
猜你喜欢
  • 2016-11-19
  • 2019-04-08
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 2020-08-15
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多