async函数:
1、函数的返回值为promise对象
2、promise对象的结果由async函数执行的返回值决定
async function main(){
// 1、如果返回值是一个非Promise类型的数据
return 521;
// 2、如果返回的是一个Promise对象
return new Promise((resolve,reject)=>{
resolve('OK');
reject('Error');
})
// 3、抛出异常
throw 'error';
}
let result = main();
console.log(result);
await表达式:
1、await右侧的表达式一般为promise对象,但也可以是其他的值
2、如果表达式是promise对象,await返回的是promise成功的值
3、如果表达式是其他的值,直接将此值作为await的返回值
注意:
1、await必须写在async函数中,但async函数中可以没有await
2、如果await的promise失败了,就会抛出异常,需要通过try…catch捕获处理
async function main(){
let p = new Promise((resolve,reject)=>{
resolve('OK');
})
// 1、右侧为promise的情况
let res = await p;
console.log(res);
// 2、右侧为其他类型的数据
let res2 = await 20;
console.log(res2);
// 3、如果promise是失败的状态
try{
let res3 = await p;
console.log(res3);
}catch(e){
console.log(e);
}
}
main();
练习:
// 读取 content1.txt content2.txt content3.txt
const fs = require('fs');
const util = require('util');
const mineReadFile = util.promisify(fs.readFile);
async function main(){
try{
// 读取第一个文件的内容
let data1 = await mineReadFile('content1.txt');
let data2 = await mineReadFile('content2.txt');
let data3 = await mineReadFile('content3.txt');
console.log(data1+data2+data3);
}catch(e){
console.log(e);
}
}
main();
async与await结合发送ajax:
function sendAjax(url){
return new Promise((resolve,reject)=>{
// 1、创建对象
const xhr = new XMLHttpRequest();
// 2、初始化
xhr.open('GET',url);
// 3、发送
xhr.send();
// 4、处理响应结果
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
// 判断响应状态码
if(xhr.status >= 200 && xhr.status <300){
// 控制台输出响应体
resolve(xhr.response);
}else{
// 控制台输出响应状态码
reject(xhr.status);
}
}
}
})
}
let btn = document.querySelector('#btn');
btn.addEventListener('click',async function(){
// 获取段子信息
let duanzi = await sendAjax('https://api.apiopen.top/getJoke');
console.log(duanzi);
})