谷歌浏览器

当前位置: 首页 >  chrome浏览器插件文件上传失败的多线程处理逻辑

chrome浏览器插件文件上传失败的多线程处理逻辑

2025-05-29 来源:谷歌浏览器官网
详情介绍

chrome浏览器插件文件上传失败的多线程处理逻辑1

1. 基于Promise.all的并行重试机制
在`background.js`中定义上传函数:
javascript
function uploadFile(file) {
return new Promise((resolve, reject) => {
// 模拟上传逻辑
setTimeout(() => Math.random() > 0.3 ? resolve() : reject(), 500);
});
}

调用时使用:
javascript
Promise.all([uploadFile(file1), uploadFile(file2)]).catch(() => {
// 触发重试逻辑
});

2. Web Workers分片上传实现
创建`worker.js`处理分片:
javascript
self.onmessage = e => {
const { chunks } = e.data;
chunks.forEach(chunk => {
// 模拟分片上传
setTimeout(() => postMessage(chunk), 300);
});
};

主线程分割文件并启动Worker:
javascript
const worker = new Worker('worker.js');
worker.postMessage({ chunks: splitFile(file) });

3. IndexedDB缓存失败记录
在`uploadFile`的reject回调中执行:
javascript
const db = openIndexedDB();
db.put({ file: file.name, timestamp: Date.now() });

通过Alarms定时检查未完成记录:
javascript
setInterval(() => {
const failedRecords = getFailedRecords();
failedRecords.forEach(record => retryUpload(record.file));
}, 60000);

4. Service Worker截取网络请求重试
注册Service Worker并监听`fetch`事件:
javascript
self.addEventListener('fetch', e => {
if (e.request.url.includes('upload')) {
e.respondWith(attemptUpload(e.request).catch(() => cloneRequest(e.request)));
}
});

设置最多3次重试:
javascript
function attemptUpload(request) {
let retries = 3;
return request.clone().then(() => --retries).then(() => {
if (retries > 0) return attemptUpload(request);
else throw new Error('Max retries reached');
});
}
返回顶部