解決vue中reader.onload讀取文件的異步問題
更新時間:2022年10月09日 15:48:05 作者:十二點的洛杉磯
這篇文章主要介紹了解決vue中reader.onload讀取文件的異步問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
reader.onload讀取文件的異步問題
問題
用element上傳文件組件上傳文件,然后在前端讀取,由于reader.onload讀取文件是異步的會造成return回去的數據無法被獲取
export function import_excel_to_json(file){
let jsonData = {}
let reader = new FileReader()
reader.readAsArrayBuffer(file)
reader.onload = function () {
let buffer = reader.result
let bytes = new Uint8Array(buffer)
let length = bytes.byteLength
let binary = ''
for (let i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i])
}
let XLSX = require('xlsx')
let wb = XLSX.read(binary, {
type: 'binary'
})
wb.SheetNames.map(item=>{
jsonData[item] = XLSX.utils.sheet_to_json(wb.Sheets[item])
jsonData[item].shift()
})
return jsonData
}
})
}在外部調用該函數:
let data = this.import_excel_to_json(File)
data獲取不到返回值
解決
用Promise進行處理
export function import_excel_to_json(file){
return new Promise(function (resolve, reject) {
let jsonData = {}
let reader = new FileReader()
reader.readAsArrayBuffer(file)
reader.onload = function () {
let buffer = reader.result
let bytes = new Uint8Array(buffer)
let length = bytes.byteLength
let binary = ''
for (let i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i])
}
let XLSX = require('xlsx')
let wb = XLSX.read(binary, {
type: 'binary'
})
wb.SheetNames.map(item=>{
jsonData[item] = XLSX.utils.sheet_to_json(wb.Sheets[item])
jsonData[item].shift()
})
resolve(jsonData);
}
})
}reader.onloadend異步返回結果問題
原本想直接return,但因為read.onloadend是異步任務,無法獲取到。
因此可以使要讀取文件的函數返回值為一個promise,這樣便可解決這一問題。


以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

