【问题标题】:How to use async await in React using the axios in the API call如何在 API 调用中使用 axios 在 React 中使用异步等待
【发布时间】:2019-06-05 02:27:18
【问题描述】:

我是网络开发的新手。我正在使用react.js。所以,在这里我想使用async/await 进行API 调用。我正在使用axios

现在,

我所拥有的是什么

export function fetchToken(bodyjson) {
  return (dispatch) => {
    let url = LOGIN_PATH + "username=" + bodyjson.userName + "&password" + "=" + bodyjson.password;
    return post(url, bodyjson)
      .then((response) => {
        if (response.status === 200) {
          localStorage.setItem('user', bodyjson.userName);
          localStorage.setItem('access_token', response.payload.access_token);
          history.push('/');
          dispatch({
            type: LOGIN_SUCCESS,
            data: response.payload,
          })
        }
        else {
          dispatch({
            type: LOGIN_FAILED,
            data: response.status,
          });
        }
      })
  }
}

我的邮政服务就像,

export const post = (url, post_data) =>
    axios.post(
        apiGatewayEndpoint.apiGatewayEndpoint + url,
        post_data,
        {
            headers: {
                "Authorization": localStorage.getItem("access_token") !== null ? `Bearer ` + localStorage.getItem("access_token") : null,
                "Content-Type": "application/json"
            }
        }
    ).then(data => {
        if (data.status === HttpStatus.OK) {
            return {
                status: data.status,
                payload: data.data
            };
        }
    }).catch(err => {
        return {
            status: err.response.data,
            payload: null
        };
    });

现在,我想在这里使用异步等待。我对此感到非常困惑。我已经阅读了很多教程。 我想在login 之后立即调用 API。在此基础上,我想将用户重定向到差异页面。

那么,谁能帮我解决这个问题async-await

谢谢:-)

现在我正在使用它,

export function fetchToken(bodyjson) {
  return async (dispatch) => {
    let url = LOGIN_PATH + "username=" + bodyjson.userName + "&password" + "=" + bodyjson.password;
    let response = await post(url, bodyjson)
    if (response.status === 200) {
      localStorage.setItem('user', bodyjson.userName);
      localStorage.setItem('access_token', response.payload.access_token);
      let fetchJd = FETCH_JD_ROOT_URL + page + "&" + size;
      let newApiResponse = await get(fetchJd)
      if (newApiResponse.status === 200) {
        dispatch({
          type: LOGIN_SUCCESS,
          data: response.payload,
        })
        dispatch(sendUserJd(newApiResponse.payload));
      }else {
    dispatch({
      type: LOGIN_FAILED,
      data: response.status,
    });
  }

    }
    else {
      dispatch({
        type: LOGIN_FAILED,
        data: response.status,
      });
    }
  }

【问题讨论】:

标签: javascript reactjs redux async-await react-redux


【解决方案1】:

对于获取请求,您可以使用参数发送数据等。

   export const getData = async () => {
    try {
        const { data } = await axios({
            method: 'get', //you can set what request you want to be
            url: `yoururl`,
            params: {
            // key values pairs   
            }
            headers: {
                'token': token
            }
        });
        // run some validation before returning
        return data;
    } catch (e) {
        console.log(e);
        return .. some error object;
    }
};

发帖请求

export const getData = async (params) => {
    try {
        const { data } = await axios({
            method: 'post', //you can set what request you want to be
            url: `url`,
            data: params,
            headers: {
                'x-auth-Token': token
            }
        });
        // run some validation before returning
        return data;
    } catch (e) {
        console.log(e);
        return .. some error object;
    }
};

错误对象示例

{
  status: 'error',
  message: 'failed with something'
}

那么你可以像这样调用任何api,

async componentDidMount() {
 const data = await getData();
 if(data.status === 'Something') {
// do something    
  }
}

【讨论】:

  • 那么,我应该用这个替换 post call 吗?
  • 我想在登录成功后立即调用一个api
  • 是的,你可以做到,如果你想在登录后调用......我希望当你在异步等待中进行所有调用时,你只需要先调用登录 api,比如等待登录( ),然后调用其他 api 如 await getSomething() 等等。使您的 api 可重用和可读
【解决方案2】:

为此,您并不完全需要 async await。

然后链方法

export function fetchToken(bodyjson) {
    return (dispatch) => {
        let url = LOGIN_PATH + "username=" + bodyjson.userName + "&password" + "=" + bodyjson.password;
        return post(url, bodyjson)
        .then((response) => {
            if (response.status === 200) {
                localStorage.setItem('user', bodyjson.userName);
                localStorage.setItem('access_token', response.payload.access_token);
                history.push('/');
                dispatch({
                    type: LOGIN_SUCCESS,
                    data: response.payload,
                })
                //next api call
                return post(newUrl, newBodyjson)
            }
            else {
                dispatch({
                    type: LOGIN_FAILED,
                    data: response.status,
                });
            }
        })
        .then((newApiResponse) => {
            //Do stuffs with new api response
        })
    }
}

但如果你只想使用 async-await 方法

export function fetchToken(bodyjson) {
    return async (dispatch) => {
        let url = LOGIN_PATH + "username=" + bodyjson.userName + "&password" + "=" + bodyjson.password;
        let response = await post(url, bodyjson)
        if (response.status === 200) {
                localStorage.setItem('user', bodyjson.userName);
                localStorage.setItem('access_token', response.payload.access_token);
                history.push('/');
                dispatch({
                    type: LOGIN_SUCCESS,
                    data: response.payload,
                })
                let newApiResponse = await post(newUrl, newBodyjson)
                //Do stuffs with new api response
            }
            else {
                dispatch({
                    type: LOGIN_FAILED,
                    data: response.status,
                });
            }
    }
}

【讨论】:

  • 你可以在所有.then的末尾添加一个catch块,并在那里处理错误
  • 嘿,我用过你的方法。这里发生的事情是,当我单击登录时,它会给出响应,然后我发送它,因此它会立即更改道具,但直到那时第二个请求尚未给出响应。那么,我应该如何处理这个问题,在发送第一个请求的响应之前,我应该在 newapi 调用本身中发送这两个请求的响应吗?>
  • 根据您的需要更改您要发送的位置。根据问题,我认为您应该在新的 api 中调度,然后阻止,即在拨打新电话后
  • 很抱歉我再问你一个问题。现在,我是全新的所以,现在如果第一个 api 调用成功但第二个 api 调用失败,并且在那个 api 调用中,我只是将用户重定向到另一个页面,那么,在这种情况下我该怎么办?我已经使用了异步等待我在问题中更新了请看一下
  • 我应该处理该请求的 else 部分中的错误吗?
猜你喜欢
  • 1970-01-01
  • 2019-03-17
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多