ES6新特性八:async函数用法实例详解

发布时间 - 2026-01-11 00:45:53    点击率:

本文实例讲述了ES6新特性之async函数用法。分享给大家供大家参考,具体如下:

1. async 函数是什么?

node.js 版本7及之后版本才支持该函数。

可以简单的理解为他是Generator 函数的语法糖,即Generator 函数调用next() 返回的结果。

Generator 函数需要next() 或执行器进行执行,而async 函数只需和普通函数一样执行。

asyncawait,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果,结果返回才会向下执行

async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。

2. 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());
};
var asyncReadFile = async function () {
 var f1 = await readFile('/etc/fstab');
 var f2 = await readFile('/etc/shells');
 console.log(f1.toString());
 console.log(f2.toString());
};

3. async 函数的作用?

在异步程序中(比如在nodejs),在下一步程序中,需要异步返回的结果,由于是异步,下一步会在异步返回前就会执行完,这时程序就会出现不是我们预想的结果。而async 函数就可以很好的解决这一问题。我们将异步操作放在await 后面,等待异步返回了结果程序才会向下执行。

举例:

/**
 * Created by Dason on 2017/3/12.
 */
var mysql = require('mysql');
var pool = mysql.createPool({
 host : '127.0.0.1' ,
 user : 'root' ,
 password : 'root' ,
 database : 'dason',
 multipleStatements: true
});
//查询所有id的方法
var getResult = function () {
 return new Promise(function(resolve,reject){
  pool.getConnection(function(err,connection){
   if(err){
    console.log(err);
    throw err;
   }
   connection.query('SELECT id FROM user',function(err,result){
    if(err){
     //console.log(err);
     throw err;
     //reject(err);
    }
    console.log(result);
    //[{id:1},{id:2},{id:4},{id:5},{id:6},{id:3},{id:7}]
    connection.release();
    resolve(result);
   });
  });
 });
};
//将所有人的name 改为 A
var updateName = function(id) {
 pool.getConnection(function(err,connection){
  if(err){
   console.log(err);
  }
  connection.query("update user set name='A' where id = ?",[id],function(err,result){
   if(err){
    console.log(err);
   }
   connection.release();
  });
 });
};
async function update() {
 /**
  * getResult 是一个异步函数,放在await 后面,
  * 当函数执行的时候,一旦遇到await就会先返回,
  * 等到异步操作完成,将异步结果返回,再接着执行函数体内后面的语句。
  */
 var result = await getResult();
 console.log("result:"+JSON.stringify(result));
 //result:[{"id":1},{"id":2},{"id":4},{"id":5},{"id":6},{"id":3},{"id":7}]
 for(const obj of result){
  updateName(obj.id);
 }
}
update();// async函数调用和普通方法一样

4. 语法

① async 函数返回一个promise 对象。

② async函数内部return语句返回的值,会成为then方法回调函数的参数。

③ async函数的await命令后面,可以是Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作),如果不是Promise 对象,会被转成一个立即resolve的 Promise 对象。

async function f() {
 return 'hello world';//会自动调用Promise.resolve('hello world'),将其转化为promise对象
}
f().then(v => console.log(v))
// "hello world"
async function f() {
 throw new Error('出错了');
}
f().then(
 v => console.log(v),
 e => console.log(e)
)
// Error: 出错了

④ async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数

注意1await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try...catch代码块中

async function main() {
 try {
 var val1 = await firstStep();
 var val2 = await secondStep(val1);
 var val3 = await thirdStep(val1, val2);
 console.log('Final: ', val3);
 }
 catch (err) {
 console.error(err);
 }
}

⑤ await命令后面的 Promise 对象如果变为reject状态,则reject的参数会被catch方法的回调函数接收到。

async function f() {
 await Promise.reject('出错了');//没有return,即不是async函数返回的promise对象,也会被catch方法的回调函数接收到
}
f()
.then(v => console.log(v))
.catch(e => console.log(e))
// 出错了

注意2:多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。不然会增加耗时。

//耗时写法
let foo = await getFoo();
let bar = await getBar();
//同时触发
// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;

希望本文所述对大家ECMAScript程序设计有所帮助。


# ES6  # 新特性  # async函数  # ES6中非常实用的新特性介绍  # JavaScript ES6的新特性使用新方法定义Class  # JavaScript中的Reflect对象详解(ES6新特性)  # 深入浅出ES6新特性之函数默认参数和箭头函数  # 简单谈谈ES6的六个小特性  # ES6新特性之Symbol类型用法分析  # ES6(ECMAScript 6)新特性之模板字符串用法分析  # ES6新特性之变量和字符串用法示例  # ES6新特性之模块Module用法详解  # ES6新特性之字符串的扩展实例分析  # ES6新特性二:Iterator(遍历器)和for-of循环详解  # ES6新特性六:promise对象实例详解  # ES6新特性七:数组的扩充详解  # ES6新特性之类(Class)和继承(Extends)相关概念与用法分析  # 让微信小程序支持ES6中Promise特性的方法详解  # ES6新特性:使用export和import实现模块化详解  # es6新特性之 class 基本用法解析  # ES6 13个新特性总结  # 才会  # 错了  # 放在  # 回调  # 就会  # 返回值  # 是一个  # 这一  # 很好  # 也会  # 他是  # 多个  # 可以用  # 只需  # 会在  # 将其  # 给大家  # 不存在  # 如果不是  # 在后面 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  使用Dockerfile构建java web环境  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  详解Oracle修改字段类型方法总结  Windows Hello人脸识别突然无法使用  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  太平洋网站制作公司,网络用语太平洋是什么意思?  Android利用动画实现背景逐渐变暗  Firefox Developer Edition开发者版本入口  Python文本处理实践_日志清洗解析【指导】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  简单实现jsp分页  高性能网站服务器配置指南:安全稳定与高效建站核心方案  ,在苏州找工作,上哪个网站比较好?  如何在Windows虚拟主机上快速搭建网站?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  网站建设保证美观性,需要考虑的几点问题!  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  如何用VPS主机快速搭建个人网站?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel如何实现API资源集合?(Resource Collection教程)  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  如何快速选择适合个人网站的云服务器配置?  浅述节点的创建及常见功能的实现  Laravel怎么在Blade中安全地输出原始HTML内容  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  在线教育网站制作平台,山西立德教育官网?  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  米侠浏览器网页背景异常怎么办 米侠显示修复  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel如何处理CORS跨域请求?(配置示例)  Swift中swift中的switch 语句  独立制作一个网站多少钱,建立网站需要花多少钱?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  微信小程序 HTTPS报错整理常见问题及解决方案  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】