async函数:多个异步操作,包装成的一个Promise对象,而await命令就是内部then命令的语法糖
语法糖:计算机语言中添加的某种语法,对语言的功能没有影响,但是更方便程序员使用。其能增加程序的可读性,减少代码出错的机会
async函数将Generator函数的星号*替换成async,将yield换成await,对Generator函数的改进体现在:
1、内置执行器:Generator函数的执行必须靠执行器,需要调用co模块或者next()非法。而async函数被调用就会自动执行得到最后结果
2、语义清晰:async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果
3、适应性广:co模块中yield命令后面只能是Thunk函数或Promise对象,而async函数的await命令后面可以是Promise对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)
4、返回值是Promise对象,用then方法来指定下一步操作:Generator函数的返回值是Iterator对象
async函数用法:返回一个Promise对象,使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
例:
async function getStockPriceByName(name) {
const symbol = await getStockSymbol(name);
const stockPrice = await getStockPrice(symbol);
return stockPrice;
}
getStockPriceByName('goog').then(function (result) {
console.log(result);
});
上面代码是一个获取股票报价的函数,函数前面的async
关键字,表明该函数内部有异步操作。调用该函数时,会立即返回一个Promise
对象。
async函数实现原理:将Generator函数和自动执行器,包装在一个函数里
例:
async function fn(args) {
// ...
}
// 等同于
function fn(args) {
return spawn(function* () {
// ...
});
}
所有的async
函数都可以写成上面的第二种形式,其中的spawn
函数就是自动执行器。