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);
});
}