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

