Async 函数

225 阅读2分钟

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;