如何让JS文件读取类的start方法返回Promise并向外传递
让文件读取类返回Promise的解决方案
我来帮你搞定这个问题!核心就是让start方法返回一个Promise,同时把文件读取的异步逻辑包裹在Promise中,这样就能在读取完成或出错时正确触发then/catch回调了。
关键修改步骤:
- 让
start方法返回Promise:start直接返回parseFile方法的执行结果,我们要把parseFile改成返回Promise。 - 将
parseFile的逻辑包裹在Promise内:通过Promise的resolve和reject来控制异步流程的结束状态。 - 替换原有的
success和错误处理逻辑:读取完成时调用resolve,出错时调用reject。
修改后的完整代码:
class MyClass { constructor() {} public start(file) { // 直接返回parseFile的Promise,让外部能链式调用 return this.parseFile(file); } private parseFile(file) { // 把整个读取逻辑包裹在Promise中,手动控制异步流程的结束 return new Promise((resolve, reject) => { let fileSize = file.size; let chunkSize = 10000; let offset = 0; let readBlock = null; // 读取全部完成时,触发resolve const onComplete = () => { resolve(file); }; // 读取出错时,触发reject const chunkErrorCallback = (error) => { reject(error); }; const onLoadHandler = function(evt) { if (evt.target.error == null) { offset += evt.target.result.length; chunkReadCallback(evt.target.result); // 假设你已经实现了这个处理分片的回调 } else { chunkErrorCallback(evt.target.error); return; } // 所有分片读取完成,触发完成逻辑 if (offset >= fileSize) { onComplete(); return; } // 继续读取下一个分片 readBlock(offset, chunkSize, file); }; readBlock = function(_offset, length, _file) { let r = new FileReader(); let blob = _file.slice(_offset, length + _offset); r.onload = onLoadHandler; // 别忘了处理FileReader自身的读取错误 r.onerror = (e) => reject(e.target.error); r.readAsText(blob); }; // 启动第一个分片的读取 readBlock(offset, chunkSize, file); }); } }
关键改动说明:
start方法现在直接返回parseFile生成的Promise,外部调用就能通过.then()监听读取完成事件。parseFile内部通过Promise包裹所有异步操作,用resolve标记读取成功完成,reject标记读取失败。- 给
FileReader添加了onerror事件处理,避免遗漏分片读取过程中的底层错误。
使用方式:
let x = new MyClass(); x.start(file) .then((file) => { console.log('文件读取完成!', file); }) .catch((error) => { console.error('文件读取出错:', error); });
这样就能完美实现你想要的Promise链式调用啦!
内容的提问来源于stack exchange,提问作者mottosson
相关产品推荐
相关产品推荐

