async 函数
async function ``_name_``([``_param_``[, ``_param_``[, ... ``_param_``]]]) { ``_statements _``}
name:函数名称;param:传递给函数的参数;statements:函数体语句。
返回值:返回的Promise对象,并且会运行执行resolve异步函数的返回结果,或者运行拒绝reject,如果异步函数抛出异常
await
[return_value] = await expression;
expression:表达式:一个Promise对象或者任何要等待的值;
返回值:返回Promise对象的处理结果,如果等待的不是Promise对象,则返回该值本身。await只会得到成功resolve的结果,若出现reject或者异常的结果需要通过try/catch来捕获
注意:await操作符必须在async函数中使用
描述:await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行 async function。
function resolveAfter2Seconds(x) {return new Promise(resolve => {setTimeout(() => {resolve(x);}, 2000);});}async function f1() {var x = await resolveAfter2Seconds(10);console.log(x); // 2s后返回:10}f1();// reject或者异常async function f3() {try {var z = await Promise.reject(30);} catch (e) {console.log(e); // 30}}f3();
应用
文件异步解析
async beforeUpload(file) {console.log(file);const isLt5M = file.size / 1024 / 1024 < 5;if (!isLt5M) {this.$message.warning("文件大小不能大于5MB");}let isLtData = null;try {const targetFileResult = await this.readFileAsync(file);const sheetLength = [];/* Parse data */const workbook = XLSX.read(targetFileResult, {type: "binary"});workbook.SheetNames.forEach(sheet => {//生成json表格内容const ws = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]);sheetLength.push(Number(ws.length));});const all = sheetLength.reduce((total, cur) => {return total + cur;});isLtData = all < 100;if (!isLtData) {this.$message.warning(`当前文件数据条数超过一万条,请重试`);}console.log("all =>", all);} catch (error) {this.$message.error(`当前文件数据解析失败,请重试`);return Promise.reject(false);}return isLt5M && isLtData ? Promise.resolve(true) : Promise.reject(false);},readFileAsync(file) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => {resolve(reader.result);};reader.onerror = reject;reader.readAsBinaryString(file);});}
