美文网首页
js网络进度监控

js网络进度监控

作者: 猪猪行天下 | 来源:发表于2023-11-04 08:59 被阅读0次

前端做网络请求是基于AJAX的,Ajax有两种方式:

  • XMLHttpRequest: 简称XHR,比较常用的axios就是基于XMLHttpRequest封装的

  • fetch:新的api,它相对应的第三方库是umi-request

浏览器原生的就支持这两种请求。其他库都是基于这两种去封装的。

xhr_fetch.png

fetch文档比较中可以看出来,它无法实现请求进度的监控,因为fetch是基于promise的,promise只有成功和失败,所以进度监控是难以处理的。

XMLHttpRequest进度监控

function xhr_request(options={}) {
    const {url, method='GET', onProgress, data=null} = options;
    return new Promise(async (resolve, reject)=> {
        const xhr = XMLHttpRequest();
        xhr.setRequestHeader('Content-Type', 'application/json');
        xhr.onreadystatechange = ()=> {
            if (xhr.readyState === XMLHttpRequest.DONE) {
                if (xhr.status === 200) {
                    resolve(xhr.responseText);
                  } else {
                    reject({status: xhr.status, message: '请求失败'})
                  }
            }
        }
        // xhr.onprogress = onProgress;
        // 或
        xhr.addEventListener('progress', e => {
            console.log(e.loaded, e.total);
            onProgress &&
            onProgress({
                loaded: e.loaded,
                total: e.total
            });
        });
        
        //监控文件上传的进度
        // xhr.upload.onprogress = onProgress;
        // 或
        xhr.upload.addEventListener('progress', onProgress);
        // 建立请求连接
        xhr.open(method, url);
        // 发送请求,data则为请求参数
        xhr.send(data);
    });
    
}

fetch进度监控

function fetch_request(options={}) {
    const {url, method='GET', onProgress, data=null} = options;

    return new Promise(async (resolve)=> {
        const resp = await fetch(url, {
            method,
            body: data
        });
        // 获取总的数据量
        const total = +resp.headers.get('content-length');
        const decoder = new TextDecoder();
        let body = '';
        // 获取数据流的读取器
        const reader = resp.body.getReader();
        let loaded = 0;
        while(1) {
            // value是buffer类型
            const {done, value} = await reader.read();
            if(done) {
                // 数据读取完成则退出循环
                break;
            }
            loaded += value.length;
            // buffer解码
            body += decoder.decode(value); 
            onProgress && onProgress({loaded, total});
        }
        resolve(body);
    });
}

相关文章

  • 页面监控之监控页面报错

    监控js报错 错误示例 监控js报错的同时监控资源加载失败,即加上捕获选项即可 错误示例 监听ajax请求 监听未...

  • 前端监控体系建设

    前端监控体系主要分为错误监控、性能监控、业务监控及安全监控三个方面。 一、错误监控 (一)监控范围 js语法错误、...

  • 一步一步搭建前端监控系统:JS错误监控篇

    摘要: 徒手写JS错误监控。 作者:一步一个脚印一个坑 原文:搭建前端监控系统(二)JS错误监控篇 Fundebu...

  • Java导入Excel到数据库工具——EXCEL-UTIL4J使

    2017.9.3 更新v2.1.0: 进度监控调整为整个导入过程的进度监控,并且更加精确 前些时日开发了一款用Ja...

  • js监控

    原因:代码异常监控解决:两个方案:(1)try..catch+无法捕捉到语法错误,只能捕捉运行时错误;+可以拿到出...

  • element 环形进度条渐变

    进度条代码 新建 SVG, 使用 js 或 css 修改进度条样式,2 种方法视情况取一 js修改样式,有多个进度...

  • 远程视频监控的实现

    远程视频监控,也称远程网络监控,是指监控者不在监控摄像头或其他摄像采集设备周围,通过网络远距离查看现场监控视频的场...

  • 用vue实现input输入框下拉模糊搜索提示功能

    效果图 js 2、实时监控searchVal的值,使用watch方法html js

  • 网络监控

    中国拥有世界上最复杂的网络环境,除去中国电信,中国联通,中国移动三大主流运营商,还有几千的二三级小运营商,中国目前...

  • 网络监控

    本文的意义 利用苹果原生的类Reachability,实时监控网络的状态 利用框架AFNetworking实时监控...

网友评论

      本文标题:js网络进度监控

      本文链接:https://www.haomeiwen.com/subject/molaidtx.html