V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
redfortress
V2EX  ›  问与答

使用 redux 中出现了问题,求教。

  •  
  •   redfortress · 2020-01-12 21:56:12 +08:00 · 1465 次点击
    这是一个创建于 1809 天前的主题,其中的信息可能已经有所发展或是发生改变。

    function allReducer(state=Map({}), action){ let newstate = Map({}) switch (action.type) {

        case SET_CSRFTOKEN: 
            return state.set("csrftoken", action.csrftoken)
    
        case START_WORK: {
            console.log('开工')
            console.log(state)
            
            axios({
                method: 'post',
                headers: {'X-CSRFToken': state.get('csrftoken')},
                url: '/start/',
                data: {startdate:action.startdate,enddate:action.enddate},   
            }).then(function (response) {
                newstate = state.set("atwork", response.data.atwork)
                console.log(newstate)
              });
            console.log(newstate)
            return newstate
        }
    

    倒数第二个 console.log(newstate)可以看到里面是有值的,最后一个 console.log(newstate)里面就是空的了,没有任何值。请问这是怎么回事?

    11 条回复    2020-01-13 07:14:12 +08:00
    ruandao
        1
    ruandao  
       2020-01-12 22:01:15 +08:00
    redux 里面不要 有 异步之类的副作用
    ruandao
        2
    ruandao  
       2020-01-12 22:02:20 +08:00
    倒数第二个 console.log(newstate)可以看到里面是有值的,最后一个 console.log(newstate)里面就是空的了,没有任何值。请问这是怎么回事?

    这个问题,是因为你不知道 promise 的运行顺序
    redfortress
        3
    redfortress  
    OP
       2020-01-12 22:12:31 +08:00 via Android
    @ruandao 那是不是要在 redux-saga 里执行这个就没问题了?
    ruandao
        4
    ruandao  
       2020-01-12 22:14:53 +08:00
    @redfortress 在哪执行都有这个问题,这个问题,是因为你不知道 promise 的运行顺序


    promise 的 then 是异步执行的
    FaiChou
        5
    FaiChou  
       2020-01-12 22:19:57 +08:00
    建议先学学基础的异步, 再用 redux
    wd
        6
    wd  
       2020-01-12 22:22:00 +08:00 via iPhone
    在那个 then 里面通过发一个 新的 action 来改状态.. 不过你这代码思路有问题
    redfortress
        7
    redfortress  
    OP
       2020-01-12 22:52:16 +08:00 via Android
    @wd 正确的思路应该是怎样的?
    redfortress
        8
    redfortress  
    OP
       2020-01-12 23:01:07 +08:00 via Android
    @ruandao 明白了。谢谢。
    redfortress
        9
    redfortress  
    OP
       2020-01-12 23:01:19 +08:00 via Android
    @FaiChou 谢谢。
    wd
        10
    wd  
       2020-01-13 07:02:56 +08:00 via iPhone
    redux 里面只管理状态,需要改变状态的时候通过 action 来改。action 可以通过多种方式触发,比如用户点击,或者其他状态变化引起的
    wd
        11
    wd  
       2020-01-13 07:14:12 +08:00 via iPhone
    https://wdicc.com/best-practice-for-react-native-redux/ 虽然写的有点早了,感觉应该还有用,希望对你有帮助。回头应该把如何 type 整理写一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5712 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:32 · PVG 14:32 · LAX 22:32 · JFK 01:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.