当前位置:首页 > 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);
});

处理分段数据合并

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

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示例配置:

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();
    });
}

性能优化建议

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

js实现ajax segment

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

标签: jsajax
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js jquery

js jquery

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

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…