async表达式
甚么是async表达式?
async表达式是采用asyncURL新闻稿的表达式。
mdn文件格式:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function
async表达式有下列三个特征:
表达式的codice为Promise第一类Promise第一类的结论由async表达式继续执行的codice下定决心为什么要用async表达式?
async和awaitURL让他们能用一类更简约的形式写下如前所述Promise的触发器犯罪行为,而无须故意地拉艾调用promise。
async表达式是不是采用?
采用实例:
<script>
// async 回到三个Promise第一类。 async function main() {
// 1. 假如codice是三个非Promise类别的统计数据,那回到的是三个获得成功的Promise第一类,结论是回到的统计数据。
return 5555;
// 2. 假如回到的是三个Promise第一类,所以那个第一类的状况和结论,是那个表达式的状况和结论
// return new Promise((resolve, reject) => { // // resolve(OK);
// // reject(ERROR);
// // throw 手忙脚乱了
// })
// 3. 抛出异常,回到的是三个失败的Promise第一类,结论为throw后面抛出的信息。 // throw error;
}
let result = main();
console.log(result);
</script>
await表达式
甚么是await表达式?
await 操作符用于等待三个Promise第一类。它只能在触发器表达式 async function 中采用。
语法:
[codice] = await 表达式;
表达式:三个Promise第一类或者任何要等待的值。
codice:回到Promise第一类的处理结论。假如等待的不是Promise第一类,则回到该值本身。
mdn文件格式:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/await
为何要用await表达式?
async和awaitURL让他们能用一类更简约的形式写下如前所述Promise的触发器犯罪行为,而无须故意地拉艾调用promise。
await表达式是不是采用?
采用实例:
<script>
async function main() {
let p = new Promise((resolve, reject) => {
resolve(OK);
// reject(ERROR) // 配合下面的案例3采用。案例1会直接报错,因为没有异常处理,await需要手动处理异常。案例2,能够得到结论,并且抛出异常。 })
// 1. await 右侧为Promise第一类的情况,codice为Promise第一类获得成功的结论值。 // let result = await p;
// console.log(result); // OK
// 2. 右侧为其他类别的统计数据,所以codice为 await 后面的那个值 let result = await 20;
console.log(result) // 20
// 3. 右侧的Promise第一类为失败的状况,则会抛出异常,此时用try…catch 捕获异常,能在catch中拿到失败的结论 // try {
// let result = await p;
// } catch(e) {
// console.log(e);
// }
}
main();
</script>
注意:
await必须写在async表达式中,但async表达式中能没有await。假如await的Promise失败了,就会抛出异常,需要通过try…catch捕获处理。案例1:
html中简单的放三个按钮就行
<button></button>
js代码:
<script>
// 封装AJAX请求
function sendAJAX(url) {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open(GET, url);
xhr.responseType = json;
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response);
} else {
reject(xhr.status);
}
}
}
})
}
// 段子接口地址:https://api.apiopen.top/getJoke
const btn = document.querySelector(button);
btn.addEventListener(click, async function() {
let result = await sendAJAX(https://api.apiopen.top/getJoke);
console.log(result);
})
</script>
案例2(简单用了下Node.js,能忽略那个案例):
采用Node.js读取三个文件(任意选三个文件)中的统计数据并进行拼接,然后在控制台输出。
代码:
const fs = require(fs);
const util = require(util);
// 回调表达式形式实现
fs.readFile(./resource/1.txt, (err, data1) => {
if (err) throw err;
fs.readFile(./resource/content.txt, (err, data2) => {
if (err) throw err;
fs.readFile(./resource/2.txt, (err, data3) => {
if (err) throw err;
console.log(data1 + data2 + data3);
})
})
})
// 采用async和await实现
const mineReadFile = util.promisify(fs.readFile);
async function main() {
// 假如手忙脚乱
try {
// 读取文件内容
let data1 = await mineReadFile(./resource/1x.txt);
let data2 = await mineReadFile(./resource/content.txt);
let data3 = await mineReadFile(./resource/2.txt);
console.log(data1 + data2 + data3);
} catch(e) {
console.log(e);
}
}