问题描述
我将一些数据封装成一个对象,目的是通过post请求将它发送到后端然后save到数据库中,但请求并未发送到后端。发送请求的逻辑如下:
export const submitComments=(comments)=>{
console.log(comments)
return dispatch => {
(async () => {
const res = await request.post(`/api/practiseDiary/comments`, comments);
if (res.status === HTTP_CODE.CREATED) {
dispatch(getGrowthNotes());
}
})();
}
};
矛盾点
我用postman测了接口,完全没有问题;在发请求之请求前完全打印要保存的对象,对象也是正确的;检查发请求的逻辑,没有发现什么问题,那么问题到底在哪?
问题解决
Q1:我在return 之上console.log(comments)可以打引出值,但是在post封装的方法里却打印不出来,为什么?
A1:打印不出来说明没有dispatch到post方法,明明有dispatch,为什么进不去post方法?怀疑可能是submitComments方法的问题有时·,submitComments方法又是怎么来的,是container里dispatch来的,找到container,my god,好像忘写dispatch了...
Q2: dispatch的是做什么的?
A2:用来action的分发,改变store里面的state。mapDispatchToProps如果传递的是一个对象,那么每个定义在该对象的函数都将被当作 Redux action creator,对象所定义的方法名将作为属性名;每个方法将返回一个新的函数,函数中dispatch方法会将action creator的返回值作为参数执行。这些属性会被合并到组件的 props 中。
我的container 如下:
const mapDispatchToProps = dispatch => ({
submitComments: (rawId, comments) => {(actions.submitComments(rawId, comments))
}
});
虽然actions里面的方法submitComments没有被dispach,但调用了该方法,所以return 之前的console.log才一定会被调用,但因为没有dispach,diapach 会延迟调用return 的方法,所以return的方法没有被调用,所以post方法才没有执行。。。
Q3: 加上dispatch后,请求还是发不出去?
A3:由于前后端的分离,在package.json中使用了proxy来代理后端,在package.json中已经加入了后端的路由,抱着尝试的态度重启了服务,再次尝试服务就可以发出去了。。。。原来package.json改变后需要重启服务,否则刚添加的内容并没有生效,还是找不到后端的路由,所以发送请求失败。。。
反思
被dispatch的问题卡住了,说明了两点,一是不够细心,检查了一遍还是那你没有发现。。。二是对dispatch的理解还是不够,所以在开始的时候才没有诊断出问题。。。
action
学习的时候通过5w1h的方法深入理解概念,会用是远远不够的,如果只是简单的会用,下次遇到bug,或是问题一变形,还是不知道怎么解决。。。
网友评论