dva models中setInterval问题

发送验证码后倒计时,在effects中 setInterval中使用yield put({type: 'changeText'})会报错,请哪位大神指教。这个验证码倒计时怎么做,

clipboard.png

/**
 * 注册
 */
import modelExtend from 'dva-model-extend'
import {message} from 'antd'
import {model} from './common'
import {getGroupList,register,sendMsg} from '../services/main'
export default modelExtend(model, {
  namespace: 'register',
  state: {
    confirmDirty:false,
    groupList: [],
    smgCodeText:'获取验证码',
    second:60
  },
  reducers: {
    changeText(state, {payload}){
      let {smgCodeText,second,timePromise} = state;
      if(second<=0){
        return {
          ...state,
          smgCodeText: '获取验证码',
          second: second,
        }
      }else{
        second--;
        return {
          ...state,
          smgCodeText: `${second}秒后可重发`,
          second: second,
        }
      }
    }
  },
  effects: {
    *sendMsg({payload}, {call, put}){
      // let data = yield call(sendMsg, payload);
      /*if(data.Type==1){
        //验证码发送成功
          yield put({type: 'changeText'});
       }else {
        message.error(data.Message);
      }*/
      setInterval(()=>{
        yield put({type: 'changeText'});
      },1000)
    },
  },
  subscriptions: {
    setup({dispatch, history}) {
    }
  }
});
阅读 7.1k
3 个回答
新手上路,请多包涵

const delay = (timeout) => {

return new Promise(resolve => {
    setTimeout(resolve,timeout)
})

}

effects: {

// 定义promise
* Interval({
      payload={},
    }, { put, call, select }){
       //60秒倒计时... 
       let i= 60
       while(i>0){
          i--;
            yield call(delay, 1000);    //参考https://dvajs.com/guide/introduce-class.html#reducer
            yield put({
                type: 'updateState',
                payload:{
                  count:i
                }
            }) 
       }
          
 }

}

yield表达式只能用在 Generator 函数里面

1、试试去掉yield,直接put

2、把你的setInterval抽离到具体的业务代码中执行,然后通过dispatch执行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题