当前位置:首页 > JavaScript

js实现ajax segment

2026-03-16 00:29:27JavaScript

使用原生JavaScript实现AJAX分段加载

XMLHttpRequest对象是原生JavaScript中实现AJAX的基础。以下展示如何通过XHR实现分段数据传输:

const xhr = new XMLHttpRequest();
xhr.open('GET', 'api/data', true);
xhr.setRequestHeader('Range', 'bytes=0-1023');

xhr.onprogress = function(event) {
    if (event.lengthComputable) {
        const percentComplete = (event.loaded / event.total) * 100;
        console.log(`已加载: ${percentComplete.toFixed(2)}%`);
    }
};

xhr.onload = function() {
    if (xhr.status === 206) {
        console.log('分段数据接收完成', xhr.response);
    }
};

xhr.send();

Fetch API实现分段请求

现代浏览器支持的Fetch API提供了更简洁的异步请求方式:

fetch('api/large-file', {
    headers: { 'Range': 'bytes=0-1023' }
})
.then(response => {
    if (response.status === 206) {
        return response.arrayBuffer();
    }
    throw new Error('分段请求失败');
})
.then(data => {
    console.log('接收到数据片段', data);
});

处理分段数据合并

接收多个分段后需要合并数据的示例:

js实现ajax segment

let receivedChunks = [];
let totalSize = 0;

function receiveChunk(chunk, startByte) {
    receivedChunks.push({
        data: chunk,
        offset: startByte
    });
    totalSize += chunk.byteLength;

    if (totalSize >= expectedTotalSize) {
        assembleChunks();
    }
}

function assembleChunks() {
    receivedChunks.sort((a, b) => a.offset - b.offset);
    const fullBuffer = new Uint8Array(totalSize);
    let position = 0;

    receivedChunks.forEach(chunk => {
        fullBuffer.set(new Uint8Array(chunk.data), position);
        position += chunk.data.byteLength;
    });

    console.log('完整数据已组装', fullBuffer);
}

服务器端配置要求

实现分段传输需要服务器支持以下功能:

  • 正确解析Range请求头
  • 返回206 Partial Content状态码
  • 包含Content-Range响应头
  • 支持multipart/byteranges内容类型

Node.js Express示例配置:

js实现ajax segment

app.get('/large-file', (req, res) => {
    const range = req.headers.range;
    if (range) {
        const [start, end] = range.replace(/bytes=/, '').split('-');
        // 实现分段逻辑
        res.writeHead(206, {
            'Content-Range': `bytes ${start}-${end}/${fileSize}`,
            'Accept-Ranges': 'bytes'
        });
        // 返回文件片段
    }
});

进度监控与错误处理

完善的实现需要包含进度跟踪和错误恢复机制:

function loadSegment(url, start, end, retryCount = 0) {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.setRequestHeader('Range', `bytes=${start}-${end}`);

        xhr.onload = () => {
            if (xhr.status === 206) {
                resolve(xhr.response);
            } else if (retryCount < 3) {
                setTimeout(() => {
                    resolve(loadSegment(url, start, end, retryCount + 1));
                }, 1000 * (retryCount + 1));
            } else {
                reject(new Error('Maximum retries exceeded'));
            }
        };

        xhr.onerror = () => reject(new Error('Network error'));
        xhr.send();
    });
}

性能优化建议

针对大文件传输的优化方案:

  • 使用Web Workers处理数据组装
  • 实现并行分段下载
  • 采用二进制格式传输(ArrayBuffer代替Base64)
  • 添加本地缓存验证(If-Range头)
  • 实现断点续传功能

标签: jsajax
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…