1.async
异步操作
内置执行器
更好的语义
更广的适用性
返回值是 Promise
2.用法
async函数返回一个Promise对象,可以使用then方法添加回调函数,当函数执行的时候,一旦遇到await就会先返回
等到异步操作完成,再接着执行函数体内后面的语句。
async function Name(name) {
const symbol = await Name(name);
const stockPrice = await Name(symbol);
return stockPrice;
}
Name("goog").then(function(result) {
console.log(result);
}
async函数返回的promise对象,
必须等到内部所有await命令后面的promise对象执行完,
才会发生状态变化除非遇到return语句或者抛出错误。
也就是说,只有等async函数内部的异步操作对象执行完
,才会执行then方法制定的回调函数
async function dbFunc(db) {
let docs = [{},{},{}];
//报错
docs.forEach(function (doc) {
await db.post(doc);
});
}
//报错,因为await用在普通函数之中了
function dbFunc(db) {//这里奴需要async
let docs = [{}, {}, {}];
//可能得到错误结果
docs.forEach(async function(doc) {
await db.post(doc);
});
}
//原因是这时三个db.post操作将是并发执行,也即是同时执行,而不是继发执行
//正确写法是采用for循环
async function dbFunc(db) {
let docs = [{},{},{}];
for (let doc of docs) {
await db.post(doc);
}
}
await针对所跟不同表达式的处理方式:
Promise 对象:await 会暂停执行,等待 Promise 对象 resolve,然后恢复 async 函数的执行并返回解析值。
非 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;
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();
///如果想让多个异步操作同时触发,缩短程序的执行时间,可以参考如下两种写法
// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;