如何用async/await封装从URL获取XLSX并转换为JSON的函数
从URL获取XLSX并转换为JSON的异步函数修复
问题核心
你当前代码的问题在于**XMLHttpRequest.send() 不返回Promise**,直接链式调用.then()无效,导致await Get_JSON()无法正确等待请求完成,外部变量自然拿不到结果。
修正后的代码
async function Outside_Test(){ try { var reso = await Get_JSON() console.log('reso_out') console.log(reso) } catch (err) { console.error('请求或转换失败:', err) } } function Get_JSON() { var url = "http://myspreadsheet.xlsx" // 用Promise包裹XHR请求,让async/await能正确等待异步操作 return new Promise((resolve, reject) => { var oReq = new XMLHttpRequest(); oReq.open("GET", url, true); oReq.responseType = "arraybuffer"; oReq.onload = function() { if (oReq.status >= 200 && oReq.status < 300) { var arraybuffer = oReq.response; /* 保留你原有的二进制转换逻辑 */ var data = new Uint8Array(arraybuffer); var arr = new Array(); for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); var bstr = arr.join(""); /* XLSX解析与JSON转换 */ var workbook = XLSX.read(bstr, { type: "binary" }); var first_sheet_name = workbook.SheetNames[0]; var worksheet = workbook.Sheets[first_sheet_name]; var reso = XLSX.utils.sheet_to_json(worksheet, { raw: true }); console.log('inside-reso') resolve(reso) // 传递转换完成的JSON结果 } else { reject(new Error(`请求失败,状态码:${oReq.status}`)) } } oReq.onerror = function() { reject(new Error('网络请求出错')) } oReq.send() }) }
关键改动说明
- 用
Promise包裹整个XHR请求流程,通过resolve返回最终JSON结果,reject抛出错误,让await能正确等待异步操作完成 - 在
onload回调中增加请求状态判断,确保成功后再执行转换逻辑 - 给
Outside_Test添加try/catch,方便捕获请求或转换过程中的异常 - 移除无效的
oReq.send().then()写法,改用Promise标准回调处理异步逻辑
内容的提问来源于stack exchange,提问作者FreeSoftwareServers
相关产品推荐
相关产品推荐

