首页 > 其他分享 >获取请求响应的进度百分比,两种方法

获取请求响应的进度百分比,两种方法

时间:2024-07-04 16:32:25浏览次数:16  
标签:百分比 const xhr res 响应 进度 loaded total fetch

        前段时间做了loading动画,增加用户体验,不至于请求时间误认为程序卡死。后来发现当网络不好或者数据过大时,请求时间比较长,没有返回完结果之前,loading一直在加载,于是改做成百分比显示进度,让客户实时感觉到程序在运行。就像下面这样。

本文用两种请求方法 'Xhr' 和 'fetch' ,来实现这个功能。

Xhr方法

        用Xhr发请求,响应进度是比较容易获取的,因为JS官方提供一个监听函数“progress”,用来对响应进度进行监听。这个方法接收一个对象,我们用到里面的两个属性,total: 表示正在执行的底层流程的工作总量,也就是总响应数据的长度,loaded: 表示底层流程已经执行的工作总量,也就是已经加载的响应数据的长度。通过这两个属性,就可以计算出来响应进度的百分比。

fetch方法

        用fetch方法也是一样,只要获取到total和loaded就可以。但是fetch没有监听函数,要换另一种方法:先通过请求头获取到 content-length 总长度,再用数据流的API  body.getReader 获取响应体已经加载好的长度,通过这两个数据,也可以计算出来响应进度百分比。

直接上代码:

        //  node服务代码

const express = require("express");
const fs = require("fs");
const path = require("path");
const app = express();

// 设置跨域访问
app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Content-Type");
  next();
});
// test.js文件与当前node服务平级,随便const一个字符串,复制内容长一点
const filePath = path.join(__dirname, "test.js");

app.get("/test", (req, res) => {
  fs.readFile(filePath, (err, data) => {

    // 设置Content-Type为text/javascript
    res.setHeader("Content-Type", "text/javascript");

    res.send(data);
  });
});


// 设置服务器监听端口
const port = 3000;
app.listen(port, () => {
  console.log(`服务器运行在 http://localhost:${port}`);
});

前端代码:

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>

<body>
  <div id="app">
    <el-button @click="visible1" type="success">xhr</el-button>
    <el-button @click="visible2" type="success">fetch</el-button>
    <br>
    <el-progress v-if="this.percentage != 100" type="circle" :percentage="percentage"></el-progress>
    <el-progress v-else type="circle" :percentage="100" status="success"></el-progress>
  </div>
</body>
<script src="./js/vue2.js"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
  new Vue({
    el: '#app',
    data: function () {
      return { percentage: 0 }
    },
    methods: {
      visible1: function () {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://localhost:3000/test');
        xhr.onreadystatechange = function () {
          if (xhr.readyState === 4 && xhr.status === 200) {
            const data = xhr.responseText;
          }
        }
        xhr.addEventListener('progress', e => {
          const { loaded, total } = e;
          // console.log(loaded, total);
          console.log(parseInt((loaded / total) * 100, 0) + '%');
          this.percentage = parseInt((loaded / total) * 100, 0)
        })
        xhr.send()
      },

      
      visible2: function () {
        fetch('http://localhost:3000/test')
          .then(async res => {
            if (!res || !res.body) {
              return
            }
            const contentLength = res.headers.get('content-length');
            let total = contentLength ? parseInt(contentLength, 10) : 0;
            let loaded = 0;
            const reader = res.body.getReader();
            while (1) {
              const { done, value } = await reader.read()
              if (done) {
                break
              }
              loaded += value.length
              this.percentage = parseInt((loaded / total) * 100, 0);
              console.log(parseInt((loaded / total) * 100, 0));
            }
          })
      }
    }
  })
</script>

</html>

通过以上代码就可以实现文章开头gif里面的效果。再调试过程中,打开浏览器F12,网络内改为慢速3G,刷新时,右击刷新按钮,选择清空缓存硬刷新,要不然有缓存,后面在测试就会响应很快,看不出来效果。

在控制台打印百分比就会看到:

       

标签:百分比,const,xhr,res,响应,进度,loaded,total,fetch
From: https://blog.csdn.net/m0_74213811/article/details/140180614

相关文章

  • Jmeter性能监控之【事务响应时间、不同时间吞吐量、点击率、每秒处理事务数】
        日常性能测试报告中除了聚合报告相关压测数据结果外,部分甲方仍要求提供事务运行响应时间(ResponseTimesOverTime)、不同时间吞吐量(BytesThroughputOverTime)、点击率(HitsperSecond)、每秒处理事务数(TransactionsperSecond)相关信息图表,压测之前可以在测试计划下添......
  • 深度长文解析SpringWebFlux响应式框架15个核心组件源码
    SpringWebFlux介绍SpringWebFlux是SpringFramework5.0版本引入的一个响应式Web框架,它与SpringMVC并存,提供了一种全新的编程范式,支持异步非阻塞的Web应用开发。WebFlux完全基于响应式编程模型,支持ReactiveStreams规范,可以在诸如Netty、Undertow以及Servlet......
  • 进度报告1
    (1)1.在黑马程序员中找到java的教学网课,初步学习了Java语言的概述以及完成了java的开发环境搭建,成功安装了jdk并且利用命令行窗口顺利验证java和javac是否正常安装并且能使用。2.编写入门代码helloworld代码:publicclassHelloWorld{publicstaticvoidmain(String[]args)......
  • vue 高德地图实现进度条轨迹回放
    <template><divstyle="position:relative"><divstyle="position:absolute;right:10px;top:10px;z-index:1"><el-button@click="silderInput">开始回放</el-button><el-button@......
  • WPF进度条中间写百分比数字
    我发现很多同学把思维固话了,通常我们需要实现的进度条是我在网上看到好多例子,但是都没有我的简单,他们不是重写ProcessBar就是使用模板,可以将TextBlock提取出来啊,灵活一点单独绑定然后一句代码Panel.ZIndex="1"就搞定了<StackPanel><ButtonContent="执行耗时......
  • Vue canvas绘制圆形进度条动画加载
    父组件代码:<template> <!--创建--> <divclass="resource-warp-box">  <divclass="center-box">   <divclass="used-source">    <pageTitletitle="已用资源"/>    <div......
  • httprunner断言-兼容细微出入的响应内容
    背景:9mobile,可能存在不统一的其他名字:NINEMOBILE/NINE_MOBILE/9MOBILEsmile,可能存在不统一的其他名字:SMILE/Smile/一串数字id(如26479376494)问题:解析手机号,归属那个运营商,兼容上述问题:方案:思考方案:方案一:是否可以在hrp的框架基础上断言多个预期值。方案二......
  • 玄机-第一章 应急响应-webshell查杀
    玄机-第一章应急响应-webshell查杀靶机账号密码rootxjwebshell1.黑客webshell里面的flagflag{xxxxx-xxxx-xxxx-xxxx-xxxx}2.黑客使用的什么工具的shellgithub地址的md5flag{md5}3.黑客隐藏shell的完整路径的md5flag{md5}注:/xxx/xxx/xxx/xxx/xxx.xxx4.黑客免杀马完......
  • vue2、vue3 纯SCSS 实现环形进度条
    vue3纯SCSS实现环形进度条<template><viewclass="flexalign-centerdiygw-col-24justify-center"><viewclass="progress-circle":class="`progress-${innerPercent}`"><viewclass=&quo......
  • 如何使用 CSS 实现响应式布局,以适应不同屏幕尺寸和设备类型?
    要实现响应式布局,可以使用CSS媒体查询和其他CSS属性进行适应不同屏幕尺寸和设备类型的布局调整。以下是实现响应式布局的一般步骤:使用viewport元标签:在html文件的元素中添加以下代码,以确保页面在移动设备上正确显示:<metaname="viewport"content="width=device-width,......