Javascript 异步等待进入actionCreator,我应该返回结果吗?

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

在我的ActionCreator中,我调用了一些RESTAPI端点来执行操作,例如
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将捕获此错误,但如果出现错误,您的状态将以某种方式发生变化,而不会出现任何错误。当然,这只是个人处理逻辑的方式。使用这样的结果是我的首选,因为我可以看到什么会回到我的状态。