鍍金池/ 問答/HTML/ dva models中setInterval問題

dva models中setInterval問題

發(fā)送驗證碼后倒計時,在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}秒后可重發(fā)`,
          second: second,
        }
      }
    }
  },
  effects: {
    *sendMsg({payload}, {call, put}){
      // let data = yield call(sendMsg, payload);
      /*if(data.Type==1){
        //驗證碼發(fā)送成功
          yield put({type: 'changeText'});
       }else {
        message.error(data.Message);
      }*/
      setInterval(()=>{
        yield put({type: 'changeText'});
      },1000)
    },
  },
  subscriptions: {
    setup({dispatch, history}) {
    }
  }
});
回答
編輯回答
背叛者

1、試試去掉yield,直接put

2、把你的setInterval抽離到具體的業(yè)務代碼中執(zhí)行,然后通過dispatch執(zhí)行。

2018年6月9日 06:39
編輯回答
忠妾

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
                }
            }) 
       }
          
 }

}

2018年4月17日 14:52
編輯回答
瞄小懶
yield表達式只能用在 Generator 函數里面

2017年3月14日 02:42