JavaScript async/await 异步编程详解

作者:小括号

时间:2026-10-24

浏览:228

本文详细解析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对象中异步执行。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注本站的更多内容!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章