async和await是ECMASript8的新特性,它们两个结合可以让异步代码像同步代码一样
1、async函数
1、async函数的返回值为promise对象;
在一个普通函数的前面加上async关键字,就会变成async函数,无论该函数你给它return什么,即使没写return,他也会返回一个promise对象
async function fn() {
console.log('111');
}
console.log(fn());
结果
2、promise对象的结果由async函数执行的返回值决定
1、如果return的不是一个promise对象,那么它的返回结果就是一个成功的promise,见上图
2、如果抛出错误,则返回的是一个失败的promise对象
async function fn() {
throw new Error('出错啦!!!');
}
console.log(fn());
结果
3、返回的结果是一个promise对象
return返回的结果成功,则async成功,返回的promise的值是里面的promise成功的值;
return返回的结果失败,则async失败,返回的promise的值是里面的promise失败的值;
async function fn() {
return new Promise((resolve,reject)=>{
resolve('成功的数据')
});
}
console.log(fn());
结果
2、await表达式
1、await必须写在async函数中
2、await右侧的表达式一般为promise对象
3、await返回的是promise成功的值
4、await的promise失败了,就会抛出异常,需要通过try...catch捕获处理
const p = new Promise((resolve, reject) => {
resolve('用户数据');
// reject('失败!!!')
});
async function fn() {
try {
let result = await p;
console.log(result);
} catch (e){
console.warn(e);
}
}
fn()
3、async 和 await结合使用
读取文件内容
const fs = require('fs');
function readA() {
return new Promise((resolve, reject) => {
fs.readFile('a.md', (err, data) => {
if (err) reject(err);
resolve(data);
})
})
}
async function readSong() {
let xiaolaoshu = await readA();
console.log(xiaolaoshu.toString());
}
readSong()
node一下,结果是
发送AJAX请求
function sendAJAX(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response);
} else {
reject('失败');
}
}
}
})
}
async function main() {
try {
let result = await sendAJAX('http://127.0.0.1:8000/server');
console.log(result);
}catch(e){
console.error(e);
}
}
main();
结果
正确时
错误时