详解Javascript如何通过async/await优雅地使用FileReader
目录
- 封装成方法
- Javascript封装成一个class
- TypeScript封装成一个class
- TypeScript基于泛型
FileReader
的使用机会很多,但是它是异步的,因此很容易出现回调地狱。
我们可以使用async/await特性,它允许我们以同步的方式调用异步代码。
封装成方法
export async function readTextFile(file: File) { const reader = new FileReader(); reader.readAsText(file); return new Promise((resolve, reject) => { reader.onload = () => resolve(reader.result); reader.onerror = () => reject(reader.error); }); } export async function readBinaryFile(file: File) { const reader = new FileReader(); reader.readAsArrayBuffer(file); return new Promise((resolve, reject) => { reader.onload = () => resolve(reader.result); reader.onerror = () => reject(reader.error); }); } export async function readAsText(file: File) { const reader = new FileReader(); reader.readAsText(file); return new Promise((resolve, reject) => { reader.onload = () => resolve(reader.result); reader.onerror = () => reject(reader.error); }); }
使用方法:
(async()=> { const buffer1 = await readTextFile(file); const buffer2 = await readBinaryFile(file); const buffer3 = await readAsText(file); })();
Javascript封装成一个class
class FileReaderEx extends FileReader{ constructor(){ super(); } #readAs(blob, ctx){ return new Promise((res, rej)=>{ super.addEventListener("load", ({target}) => res(target.result)); super.addEventListener("error", ({target}) => rej(target.error)); super[ctx](blob); }); } readAsArrayBuffer(blob){ return this.#readAs(blob, "readAsArrayBuffer"); } readAsDataURL(blob){ return this.#readAs(blob, "readAsDataURL"); } readAsText(blob){ return this.#readAs(blob, "readAsText"); } }
使用方法:
(async()=>{ const buffer1 = await new FileReaderEx().readAsArrayBuffer(blob1); const buffer2 = await new FileReaderEx().readAsDataURL(blob2); const buffer3 = await new FileReaderEx().readAsText(blob3); })();
TypeScript封装成一个class
export class FileReaderEx extends FileReader { constructor() { super(); } private readAs(blob: Blob, ctx: 'readAsArrayBuffer' | 'readAsDataURL' | 'readAsText') { return new Promise((res, rej) => { super.addEventListener("load", ({target}) => res(target?.result)); super.addEventListener("error", ({target}) => rej(target?.error)); super[ctx](blob); }); } readAsArrayBuffer(blob: Blob) { return this.readAs(blob, "readAsArrayBuffer"); } readAsDataURL(blob: Blob) { return this.readAs(blob, "readAsDataURL"); } readAsText(blob: Blob) { return this.readAs(blob, "readAsText"); } }
使用方法:
(async()=>{ const buffer1 = await new FileReaderEx().readAsArrayBuffer(blob1); const buffer2 = await new FileReaderEx().readAsDataURL(blob2); const buffer3 = await new FileReaderEx().readAsText(blob3); })();
TypeScript基于泛型
/** * @description 同步调用包装 * @param promise 需要被调用的异步方法 */ async function asyncWrap<T = any>(promise: Promise<T>): Promise<T | null> { try { return await promise; } catch (err) { return null; } } export async function fileReaderWrap<T = any>(blob: Blob, ctx: 'readAsArrayBuffer' | 'readAsDataURL' | 'readAsText'): Promise<any> { const reader = new FileReader(); reader[ctx](blob); return new Promise((resolve, reject) => { reader.onload = () => resolve(reader.result); reader.onerror = () => reject(reader.error); }); }
使用方法:
(async()=>{ const buffer1 = await asyncWrap<ArrayBuffer>(fileReaderWrap<ArrayBuffer>(file, 'readAsArrayBuffer')); const buffer2 = await asyncWrap<ArrayBuffer>(fileReaderWrap<ArrayBuffer>(file, 'readAsDataURL')); const buffer3 = await asyncWrap<ArrayBuffer>(fileReaderWrap<ArrayBuffer>(file, 'readAsText')); })();
到此这篇关于详解Javascript如何通过async/await优雅地使用FileReader的文章就介绍到这了,更多相关Javascript async/await使用FileReader内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Js中FileReader读取文件内容方法详解(async/await)
- JavaScript中的FileReader示例详解
- js利用FileReader读取本地文件或者blob方式
- JS如何通过FileReader获取.txt文件内容
- JS中FileReader类实现文件上传及时预览功能
- JS中利用FileReader实现上传图片前本地预览功能