国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

ES6新特性八:async函數用法實例詳解

2019-11-19 16:46:28
字體:
來源:轉載
供稿:網友

本文實例講述了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 改為 Avar 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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 民县| 延川县| 邢台市| 彩票| 多伦县| 元朗区| 施秉县| 广丰县| 海城市| 自贡市| 万山特区| 涡阳县| 洪湖市| 茶陵县| 定兴县| 屏山县| 江津市| 兴安盟| 龙川县| 鄂伦春自治旗| 柳林县| 临洮县| 庄浪县| 柳州市| 垫江县| 彰武县| 汪清县| 长子县| 柞水县| 育儿| 北宁市| 桃园市| 古田县| 报价| 屯留县| 屏南县| 镇康县| 达孜县| 噶尔县| 垫江县| 旬邑县|