来自 美高梅4858永利777 2019-12-16 10:05 的文章
当前位置: 美高梅游戏平台网站 > 美高梅4858永利777 > 正文

ES6新特性八:async函数用法实例详解_javascript技巧_脚本之家

本文实例讲述了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;//读取文件的方法var readFile = function  { return new Promise(function  { fs.readFile(fileName, function { if ; resolve;};var gen = function* () { var f1 = yield readFile; var f2 = yield readFile; console.log; console.log;};var asyncReadFile = async function () { var f1 = await readFile; var f2 = await readFile; console.log; console.log;};

3. async 函数的作用?

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

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

4. 语法

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

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

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

async function f() { return 'hello world';//会自动调用Promise.resolve,将其转化为promise对象}f().then// "hello world"async function f() { throw new Error.then, e => console.log// 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; var val3 = await thirdStep; console.log; } catch  { console.error; }}

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

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

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

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

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

本文由美高梅游戏平台网站发布于美高梅4858永利777,转载请注明出处:ES6新特性八:async函数用法实例详解_javascript技巧_脚本之家

关键词: