async/await 是ECMAScript7提出来解决异步问题的方案,这个要比ES6的promise使用起来更清晰,更方便。
用法:
- 在JavaScript里的函数前面加上
async
关键字,则这个函数的返回结果就会变成一个Promise对象。 - await必须放在async函数里
- 在await后面接一个函数,来等待这个函数执行完成,如果这个函数返回的是Promise,则等待这个函数里异步结果执行完成(resolve())后再继续往下执行;如果返回的是非Promise,则函数里面的代码执行完就返回,不管有没有异步的结果。
举例:async/await配合promise使用
const fs = require("fs");
const read = function(fileName){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if (err) {
reject(err);
} else{
resolve(data);
}
});
});
};
async function readByAsync(){
let a1 = await read('1.txt');
let a2 = await read('2.txt');
let a3 = await read('3.txt');
console.log(a1.toString());
console.log(a2.toString());
console.log(a3.toString());
}
readByAsync();
注意: await语句后的Promise对象变成reject状态时,那么整个async函数会中断,后面的程序不会继续执行,所以还需要通过try…catch处理一下。
const fs = require("fs");
const read = function(fileName){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if (err) {
reject(err);
} else{
resolve(data);
}
});
});
};
async function readByAsync(){
let a1;
let a2;
let a3;
try{
a1 = await read('1.txt');
a2 = await read('2.txt');
a3 = await read('3.txt');
}catch(e){
//TODO handle the exception
}
console.log(a1);
console.log(a2);
console.log(a3);
}
readByAsync();