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

1. async 函数是什么?
node.js 版本7及之后版本才支持该函数。
可以简单的理解为他是Generator 函数的语法糖,即Generator 函数调用next() 返回的结果。
① Generator 函数需要next() 或执行器进行执行,而async 函数只需和普通函数一样执行。
② async和await,比起星号和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方法指定的回调函数。
注意1:await命令后面的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个新特性总结
# 才会
# 错了
# 放在
# 回调
# 就会
# 返回值
# 是一个
# 这一
# 很好
# 也会
# 他是
# 多个
# 可以用
# 只需
# 会在
# 将其
# 给大家
# 不存在
# 如果不是
# 在后面
相关文章:
建站之星上传入口如何快速找到?
南平网站制作公司,2025年南平市事业单位报名时间?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何访问已购建站主机并解决登录问题?
微信小程序 input输入框控件详解及实例(多种示例)
如何通过远程VPS快速搭建个人网站?
教学网站制作软件,学习*后期制作的网站有哪些?
建站主机选哪种环境更利于SEO优化?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
b2c电商网站制作流程,b2c水平综合的电商平台?
公司网站的制作公司,企业网站制作基本流程有哪些?
制作门户网站的参考文献在哪,小说网站怎么建立?
外贸公司网站制作哪家好,maersk船公司官网?
如何通过山东自助建站平台快速注册域名?
如何用y主机助手快速搭建网站?
如何通过虚拟主机空间快速建站?
股票网站制作软件,网上股票怎么开户?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
建站之星免费版是否永久可用?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
如何快速搭建自助建站会员专属系统?
建站主机选购指南:核心配置与性价比推荐解析
如何正确选择百度移动适配建站域名?
建站主机空间推荐 高性价比配置与快速部署方案解析
C#如何序列化对象为XML XmlSerializer用法
建站之星24小时客服电话如何获取?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何在IIS服务器上快速部署高效网站?
郑州企业网站制作公司,郑州招聘网站有哪些?
建站上市公司网站建设方案与SEO优化服务定制指南
在线制作视频的网站有哪些,电脑如何制作视频短片?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
开源网站制作软件,开源网站什么意思?
想学网站制作怎么学,建立一个网站要花费多少?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
大连网站制作公司哪家好一点,大连买房网站哪个好?
制作网站的基本流程,设计网站的软件是什么?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何通过虚拟主机快速搭建个人网站?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
网站制作公司排行榜,抖音怎样做个人官方网站
如何用5美元大硬盘VPS安全高效搭建个人网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何用VPS主机快速搭建个人网站?
宝塔面板创建网站无法访问?如何快速排查修复?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。