原文教程:
1、我的场景是请求 csv 文件,我希望获取下载进度。下面是各种实现的代码。
2、如果是上传进度可能不太一样。有必要的话将来回来补充。
3、如果是请求正常接口的话,似乎无法获得进度,是一步到位的。也就是: { loaded: 【文件总大小】,total: 0 }。所以无法用于请求普通接口。
axios 请求下载文件时的进度条事件
;(async () => {
// 启动计时器
console.time('📝耗时统计:')
// your code...
await axios({
url: './全量数据-20220309144842.csv',
method: 'get',
onDownloadProgress(progress) {
const step = Math.round(progress.loaded / progress.total * 100)
console.log(step + '%')
}).then(res => {
console.log('正在解析...')
const data = csvJSON(res.data)
console.log('解析完成', data)
// 停止计时,输出时间
console.timeEnd('📝耗时统计:')
})();
ajax 请求下载文件时进度条事件
var xhrOnProgress = function (fun) {
return function () {
var xhr = $.ajaxSettings.xhr()
xhr.onprogress = fun
return xhr
$.ajax({
type: 'GET',
url: './全量数据-20220309144842.csv',
xhr: xhrOnProgress(function (progress) {
const percent = Math.round(progress.loaded / progress.total * 100)
console.log(percent + '%')
fetch 请求下载文件时进度条事件
/* https://javascript.info/fetch-progress */
;(async () => {
// Step 1: start the fetch and obtain a reader
let response = await fetch('./全量数据-20220309144842.csv');
const reader = response.body.getReader();
// Step 2: get total length
const contentLength = +response.headers.get('Content-Length');
// Step 3: read the data
let receivedLength = 0; // received that many bytes at the moment
let chunks = []; // array of received binary chunks (comprises the body)
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
chunks.push(value);
receivedLength += value.length;
console.log(`Received ${receivedLength} of ${contentLength}`, )
const percent = Math.round(receivedLength / contentLength * 100)
console.log(percent + '%')
// Step 4: concatenate chunks into single Uint8Array
let chunksAll = new Uint8Array(receivedLength); // (4.1)
let position = 0;
for (let chunk of chunks) {
chunksAll.set(chunk, position); // (4.2)
position += chunk.length;
// Step 5: decode into a string
let result = new TextDecoder("utf-8").decode(chunksAll);
// We're done!
console.log(20220309231613, result)
})();