如何在获取请求期间显示 Axios 的进度(不是下载或上传)

Posted

技术标签:

【中文标题】如何在获取请求期间显示 Axios 的进度(不是下载或上传)【英文标题】:How to show progress of Axios during get request (not download or upload) 【发布时间】:2019-06-10 08:02:53 【问题描述】:

我想要在 Axios 收到我的请求时显示进度条。 axios 包同时具有 onDownloadProgressonUploadProgress 以在下载或上传期间显示进度条,但在获取请求期间没有进度条。我搜索了很多问题和文章,但它们总是关于下载/上传进度或 Vue.js,我无法理解如何在 React 中执行此操作。我在下面有以下代码(这不起作用,因为我没有下载)。理想情况下,我会自己写;但如果有人可以解释我如何将loadProgressBar() 与我的 Axios 请求集成,我愿意考虑使用 axios-progress package。

request = () => 
    this.setState(error: null, results: [])
    axios(
        method: 'get',
        url: process.env.REACT_APP_API_LOCALS,
        responseType: 'json',
        onDownloadProgress: (progressEvent) => 
            var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
            this.setState(
                loading: percentCompleted
            )
        ,
    )
    .then(
        (response) => 
            console.log(response)
            this.setState(
                results: response.data.results,
                error: null,
                totalPages: Math.ceil(response.data.count / response.data.results.length)
            )  
        
    )
    .catch(
        (error) => 
            this.setState(
                loading: null,
                error: true
            )  
        
    );

【问题讨论】:

【参考方案1】:

这就是在 React 中对我有用的东西:

const client = axios.create(
  baseURL: 'http://localhost:10000/v1/client',
  timeout: 20000
)

let result = await client.get('/fetchMeSomething', 
  onDownloadProgress: progressEvent => 
    const total = parseFloat(progressEvent.currentTarget.responseHeaders['Content-Length'])
    const current = progressEvent.currentTarget.response.length

    let percentCompleted = Math.floor(current / total * 100)
    console.log('completed: ', percentCompleted)
  
)
.then(res => 
  console.log("All DONE: ", res.headers)
  return res.data
)

【讨论】:

您也可以使用let percentCompleted = Math.floor(progressEvent.loaded / progressEvent.total * 100),因此无需解析和查看标题。【参考方案2】:
  axios
  .get("download something", 
    onDownloadProgress: (progressEvent) => 
      let downloadCount = DownloadCount(
        progressEvent.timeStamp,
        progressEvent.total,
        progressEvent.loaded
      );
      let percentCompleted = Math.round(
        (progressEvent.loaded * 100) / progressEvent.total
      );
      setProgressing(percentCompleted);
      dispatch(
        type: "downloading",
        payload: downloadCount.toFixed(1),
      );
    ,
  )
  .then((response) => )
  .catch((error) => 
    console.log(error);
  );

【讨论】:

【参考方案3】:

我认为axios 暴露onUploadProgressonDownloadProgress 的原因是您可以轻松地对正在传输的字节执行一些计算。在简单的服务器请求的情况下,我认为使用诸如设置的标志

state = 
  loading: false

只要您提出理想的请求,请将其转至true。如果您愿意,可以使用微调器作为遮罩。

【讨论】:

我知道怎么做的微调器,确实,它是从假到真的简单切换。但是,我至少有 7 个页面,其中包含大量数据的不同请求。我发现这个案例需要一个进度条而不是微调器,以便用户知道加载内容需要多长时间。 你有没有想过使用SuspenseReact.lazy?我认为在这种情况下这样做是正确的(如果我没记错的话),在用户浏览页面时逐步加载页面,而不是一次加载所有页面。它还改善了用户体验。 我认为使用它肯定会很有趣!在这种情况下,我认为一个简单的微调器就可以了。然而;因为我还没有在文章和 *** 上找到这个特定问题的答案,所以我将暂时搁置这个问题,以便未来遇到相同问题的 React 开发人员可以在这里找到解决方案。感谢 Suspense / React.lazy 提示! @tbuglc 不客气。您可能还会发现 Andrew Clark Concurrent Rendering in React[youtube.com/watch?v=ByBPyMBTzM0] 的演讲很有趣【参考方案4】:

我知道您要求提供进度条,但我已经使用本教程创建了一个进度圈,它利用具有 stroke-dasharraystroke-dashoffset 属性的 svg 圆圈。

https://css-tricks.com/building-progress-ring-quickly/

整个事情都是在 React 中完成的,所以它对你来说应该是一个非常简单的实现。

【讨论】:

以上是关于如何在获取请求期间显示 Axios 的进度(不是下载或上传)的主要内容,如果未能解决你的问题,请参考以下文章

axios进度的请求显示

Facebook 如何在 AJAX 页面加载期间显示浏览器加载进度?

axios 获取实时数据请求

Vue axios中post获取到一个对象,如何展示对象中的二进制图片?

如何在 axios 中获取 onUploadProgress?

Axios 获取请求问题