詳解Javascript如何通過async/await優(yōu)雅地使用FileReader
FileReader
的使用機會很多,但是它是異步的,因此很容易出現(xiàn)回調(diào)地獄。
我們可以使用async/await特性,它允許我們以同步的方式調(diào)用異步代碼。
封裝成方法
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 同步調(diào)用包裝 * @param promise 需要被調(diào)用的異步方法 */ 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')); })();
到此這篇關(guān)于詳解Javascript如何通過async/await優(yōu)雅地使用FileReader的文章就介紹到這了,更多相關(guān)Javascript async/await使用FileReader內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript將數(shù)字轉(zhuǎn)換成大寫中文的方法
這篇文章主要介紹了JavaScript將數(shù)字轉(zhuǎn)換成大寫中文的方法,涉及javascript字符串及匹配的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03基于HTML模板和JSON數(shù)據(jù)的JavaScript交互(移動端)
這篇文章主要介紹了基于HTML模板和JSON數(shù)據(jù)的JavaScript交互(移動端)的相關(guān)資料,需要的朋友可以參考下2016-04-04js一維數(shù)組、多維數(shù)組和對象的混合使用方法
這篇文章主要介紹了js一維數(shù)組、多維數(shù)組和對象的混合使用方法,需要的朋友可以參考下2016-04-04CocosCreator通用框架設(shè)計之網(wǎng)絡(luò)
這篇文章主要介紹了CocosCreator通用框架設(shè)計之網(wǎng)絡(luò),詳細講解了WebSocket的原理和使用方法,對WebSocket感興趣的同學,一定要看一下2021-04-04JS基于ES6新特性async await進行異步處理操作示例
這篇文章主要介紹了JS基于ES6新特性async await進行異步處理操作,結(jié)合實例形式分析了async await進行異步處理操作的相關(guān)原理、步驟與注意事項,需要的朋友可以參考下2019-02-02