JavaScript async/await 异步编程详解
本文详细解析JavaScript中async函数的核心机制。通过对比Generator函数,阐述async如何以内置执行器、更清晰的语义及更广的适用性优化异步编程。重点说明async返回Promise对象的规则,以及await对Promise状态阻塞与值提取的行为,帮助开发者掌握ES7异步语法最佳实践。
前言:async是“异步”的简写,async用于声明一个function为异步函数,而await用于等待一个异步方法执行完成,await只能出现在async函数中。

Generator函数:
var fs = require('fs');
var readFile = function (fileName){
return new Promise(function (resolve, reject){
fs.readFile(fileName, function(error, data){
if (error) reject(error);
resolve(data);
});
});
};var gen = function* (){
var f1 = yield readFile('/etc/fstab');
var f2 = yield readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
}async函数
var asyncReadFile = async function (){
var f1 = await readFile('/etc/fstab');
var f2 = await readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};显而易见,async函数中async就是将Generator函数的星号(*)替换成async,await等价于yield。
async函数是非常新的语法功能,属于ES7。目前,它仍处于提案阶段,但是转码器Babel和regenerator都已经支持,转码后就能使用。
但async函数对Generator函数做了改进:
1、内置执行器:Generator函数的执行必须靠执行器,所以才有了co函数库,而async函数自带执行器。也就是说,async函数的执行,与普通函数一模一样。
var result = asyncReadFile();2、更好的语义:async和await,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
3、更广的适用性:co函数库约定,yield命令后面只能是Thunk函数或Promise对象,而async函数的await命令后面,可以跟Promise对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)。
async的作用
async函数负责返回一个Promise对象,如果在async函数中return一个直接量,async会把这个直接量通过Promise.resolve()封装成Promise对象;如果async函数没有返回值,它会返回Promise.resolve(undefined)。
await在等待什么
如果await等到的不是一个promise对象,那跟着的表达式的运算结果就是它等到的东西;
如果是一个promise对象,await会阻塞后面的代码,等promise对象resolve,得到resolve的值作为await表达式的运算结果。
虽然await阻塞了,但await在async中,async不会阻塞,它内部所有的阻塞都被封装在一个promise对象中异步执行。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注本站的更多内容!
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
