为什么反应查询需要异步 api 调用?

Why are async api calls necessary with react-query?

每篇文档都显示异步调用与 react-query 一起使用,但我有点困惑为什么这些是必要的,因为以下代码在有或没有 async/await:

的情况下都有效
export const apiCall = (method, path, data) => {
    return axios({method, url: API_PREFIX + path, data})
        .then(resp => resp.data)
        .catch(error => {

        });
};

export const useData = () => {
    const {data, isLoading, error, refetch} = useQuery(
        'users',
        async () => await apiCall(dispatch, 'get', '/some-endpoint'),
    );

    return {
        userList: data,
        refetch,
        isLoading
    }
}

react-query 希望您 return 已解决或已拒绝的承诺 - 您可以根据需要生成此承诺。 JavaScript 有很多选项可以产生承诺。 async / await 基本上只是承诺与 .then.catch.

链接的替代语法

您 post 编写的代码也可以工作,但是,它也有一些不必要的部分:

async () => await apiCall(dispatch, 'get', '/some-endpoint'),

这里不需要 async / await,因为 apiCall 已经 return 是一个 Promise,所以这也是一样的:

() => apiCall(dispatch, 'get', '/some-endpoint'),

此外,我不会 .catchapiCall 函数中,因为它会将失败的 Promise 转换为成功的 Promise。使用 react-query,您确实希望将失败的 Promise returned 到 react-query,以便库可以为您进行错误处理。否则,它不知道错误并且不能重试/不能给你错误状态等。

所以对于 apiCall,这两件事也是等价的,并且可以很好地与 react-query 一起工作:

export const apiCall = (method, path, data) => {
    return axios({method, url: API_PREFIX + path, data})
        .then(resp => resp.data)
};
export const apiCall = async (method, path, data) => {
    const response = await axios({method, url: API_PREFIX + path, data})
    return respons.data
};

这实际上只取决于您更喜欢哪种语法 - 大多数人更喜欢 async / await,因为它避免了过多的回调链。

我也写了一篇关于这个主题的比较全面的博客 post:https://tkdodo.eu/blog/about-async-functions