Javascript 异步等待进入actionCreator,我应该返回结果吗?
在我的ActionCreator中,我调用了一些RESTAPI端点来执行操作,例如Javascript 异步等待进入actionCreator,我应该返回结果吗?,javascript,reactjs,redux,fetch,state,Javascript,Reactjs,Redux,Fetch,State,在我的ActionCreator中,我调用了一些RESTAPI端点来执行操作,例如UPDATE\u CART\u ITEM等 起初,我使用axios,就像这样return axios()…: export const login = (username, password) => (dispatch) => { dispatch(requestLogin()) const URL = `${USERS_URL}?username=${username}&passwor
UPDATE\u CART\u ITEM
等
起初,我使用axios,就像这样return axios()…
:
export const login = (username, password) => (dispatch) => {
dispatch(requestLogin())
const URL = `${USERS_URL}?username=${username}&password=${password}`
return axios(URL)
.then((response) => {
return response.data
})
.then((user) => {
dispatch(loginSuccess(user))
// save the user on localStorage
localStorage.setItem('user', JSON.stringify(user))
// direct the logedin user to the games page
history.push('/')
})
.catch(() => {
return dispatch(loginFailure())
})
}
现在我像这样使用async/await:
// On payload i have the obj: {prId: 'xxxxx'}
export const updateCartItem = (payload) => async (dispatch) => {
const response = await fetch('cart/update',
{
body: JSON.stringif(payload),
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
method: 'POST',
})
// I m not sure if i have to return the result
const result = await response.json()
// I dispatch the action with the payload
await dispatch(return {
payload,
type: UPDATE_CART_ITEM,
})
} catch (err) {
dispatch(cartActionFail(err))
}
}
那么,在updateArtItem
函数中,我应该如何处理结果
?因为我正在将有效载荷传递给减速器,所以我似乎不需要它。您可能需要这样做:
分派({负载:响应,类型:更新\购物车\项目})
dispatch(return{/*…*/})
据我所知没有意义,而且dispatch()
没有返回承诺,因此等待它没有意义
通常,如果您想用async/await替换承诺链,那么您需要用
foo.then(bar=>{baz(bar);})
替换为const bar=await foo;巴兹(巴)代码>您可能希望执行以下操作:
分派({负载:响应,类型:更新\购物车\项目})
dispatch(return{/*…*/})
据我所知没有意义,而且dispatch()
没有返回承诺,因此等待它没有意义
通常,如果您想用async/await替换承诺链,那么您需要用foo.then(bar=>{baz(bar);})
替换为const bar=await foo;巴兹(巴)代码>如果您需要立即使用您的结果,那么您应该发送一个操作,如UPDATE\u CART\u ITEM\u success,否则什么也不做
顺便说一句,我建议您使用redux saga或redux thunk来处理应用程序的副作用,如API调用。如果您需要立即使用结果,那么您应该发送一个操作,如更新\u CART\u ITEM\u success,否则什么也不做
顺便说一句,我建议您使用redux saga或redux thunk来处理应用程序的副作用,如API调用。如果您对动作创建者使用相同的负载,如果后端出现问题会发生什么?您的后端端不会改变,但您的状态不会意识到这一点,并使用有效负载更新自身。这就是为什么您应该在这里使用一些错误检查。此外,就个人而言,我使用最后一个结果作为动作创建者的有效载荷,而不是原始有效载荷
export const updateCartItem = payload => async ( dispatch ) => {
try {
const response = await fetch(
"cart/update",
{
body: JSON.stringif( payload ),
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
method: "POST",
}
);
if ( !response.ok ) { throw new Error( "response error" ); }
const result = await response.json();
return dispatch( {
payload: result,
type: UPDATE_CART_ITEM,
} );
} catch ( error ) {
return dispatch( cartActionFail( error.message ) );
}
};
您可以根据需要更改和增强此逻辑。正如@vkarpov15所指出的,dispatch没有显式地使用return
,也没有返回承诺,因此您不需要在那里等待。如果您对操作创建者使用相同的负载,那么如果后端出现问题会发生什么?您的后端端不会改变,但您的状态不会意识到这一点,并使用有效负载更新自身。这就是为什么您应该在这里使用一些错误检查。此外,就个人而言,我使用最后一个结果作为动作创建者的有效载荷,而不是原始有效载荷
export const updateCartItem = payload => async ( dispatch ) => {
try {
const response = await fetch(
"cart/update",
{
body: JSON.stringif( payload ),
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
method: "POST",
}
);
if ( !response.ok ) { throw new Error( "response error" ); }
const result = await response.json();
return dispatch( {
payload: result,
type: UPDATE_CART_ITEM,
} );
} catch ( error ) {
return dispatch( cartActionFail( error.message ) );
}
};
您可以根据需要更改和增强此逻辑。正如@vkarpov15所指出的,dispatch不显式地使用return
,也不返回承诺,因此您不需要在那里等待。事实上,在这种情况下,我可以使用“result”作为有效负载。但是不是try{}catch()告诉我后端发生了什么错误吗?我已经编辑了我的答案。是的,如果发生错误,您是对的。try/catch将捕获此错误,但如果出现错误,您的状态将以某种方式发生变化,而不会出现任何错误。当然,这只是个人处理逻辑的方式。使用这样的结果是我的首选,因为我可以看到什么回到我的状态。事实上,在这种情况下,我可以使用“结果”作为有效负载。但是不是try{}catch()告诉我后端发生了什么错误吗?我已经编辑了我的答案。是的,如果发生错误,您是对的。try/catch将捕获此错误,但如果出现错误,您的状态将以某种方式发生变化,而不会出现任何错误。当然,这只是个人处理逻辑的方式。使用这样的结果是我的首选,因为我可以看到什么会回到我的状态。