#关于 dva中dispatch函数实现异步回调函数的方式
1.通过promise函数实现
这里先给出index.js 和modal模块的实现 services模块不需要做处理
//index.js
import { useEffect } from 'react';
function index(props){
const {dispatch} = props;
// useEffect 保证只会在第一次渲染时运行
useEffect(() => {
// 通过Promise 函数来限定要在执行到reslove后才能执行下一步
new Promise((resolve, err) =>{
dispatch({
type: "index/get",
payload: {
//这里的payload是用于传入参数,将resolve作为一个函数参数传入
resolve,
}
});
}).then(res=>{
// 这里的res是下面模块中的res.data 即reslove的参数
console.log("do something after get");
console.log("res", res);
})
}, [])
}
// modal/index.js
import {set} from 'immutable';
import {get} from 'servives/index'
export default {
namespace: 'index',
state: {
},
// effect 即上面请求的函数
effect: {
*get(state, {call, put}){
// 将 resolve 从传入的payload参数中解析出来
const {resolve} = payload;
// yield 实现真正的异步回调 当还在请求时不会执行下一个 yield put
const res = yield call(get, payload);
yield put({ type: 'save', payload: {res, resolve} || {} });
}
}
reducers: {
save(state,{payload}){
// 当有回调后 执行resolve 并传入返回值,这样就实现了dispatch的回调函数
const {resolve, res} = payload;
!!resolve && resolve(res.data);
return set(state, 'operators', payload);
}
},
};