深入淺出ES6教程『async函數(shù)』

?? 個(gè)人主頁歡迎訪問 ??


大家好衡怀,本人名叫蘇日儷格够庙,大家叫我 (格格) 就好靠娱,在上一章節(jié)中我們學(xué)到了Symbol & generator的用法,下面我們一起來繼續(xù)學(xué)習(xí)async函數(shù):

async [?'z??k]:這個(gè)單詞看起來很怪異敛纲,它的原型是asynchrony喂击,意為異步,一般單詞按理說都能把音準(zhǔn)讀個(gè)大概淤翔,這個(gè)就...

與其同時(shí)呢翰绊,也有的人看了這個(gè)詞想到了放在script標(biāo)簽里的異步腳本,但是此async非彼async旁壮,這個(gè)async是ES2017出來的监嗜,有時(shí)候ajax請求需要做同步處理,就是ajax如何同步請求抡谐,那就用到它了裁奇;和ES6中的promise類似,nodeJs里面有一個(gè)典型的異步操作麦撵,下面用三種異步處理方式來讀取文件readFile():

  • 1刽肠、promise來讀取文件
// promise.js
const fs = require("fs");
const read = function(fileName){
    return new Promise((resolve,reject)=>{
        fs.readFile(fileName,(err,data)=>{
            if (err) {
                reject(err);
            } else{
                resolve(data);
            }
        });
    });
};
read('1.txt').then(res=>{
    console.log(res.toString());
    return read('2.txt');  // 返回新的數(shù)據(jù),然后輸出
}).then(res => {
    console.log(res.toString());
    return read('3.txt');
}).then(res => {
    console.log(res.toString());
});

然后用node來運(yùn)行該文件免胃,打開命令行(win+r):

因?yàn)樽x取多個(gè)文件一般都會(huì)作為一個(gè)異步來處理音五,這樣就不會(huì)阻塞程序的運(yùn)行,把fs封裝成一個(gè)Promise對象杜秸,然后在下面返回?cái)?shù)據(jù)輸出放仗,例子中的TXT文件可以寫自己的數(shù)據(jù)

  • 2、generator函數(shù)讀取文件
// generator.js
const fs = require("fs");
const read = function(fileName){
    return new Promise((resolve,reject)=>{
        fs.readFile(fileName,(err,data)=>{
            if (err) {
                reject(err);
            } else{
                resolve(data);
            }
        });
    });
};
function * show(){
    yield read('1.txt');
    yield read('2.txt');
    yield read('3.txt');
}
const s = show();
s.next().value.then(res => {
    console.log(res.toString());
    return s.next().value;
}).then(res => {
    console.log(res.toString());
    return s.next().value;
}).then(res => {
    console.log(res.toString());
});

依然用node運(yùn)行即可撬碟,這種方式代碼量又高了不少诞挨,和Promise方式特別像,只不過是把讀取文件的信息放在了外面呢蛤,在下面依次手動(dòng)調(diào)用惶傻,特別麻煩,下面我們來介紹第三種方式:

  • 3其障、async函數(shù)讀取文件
const fs = require("fs");
const read = function(fileName){
    return new Promise((resolve,reject)=>{
        fs.readFile(fileName,(err,data)=>{
            if (err) {
                reject(err);
            } else{
                resolve(data);
            }
        });
    });
};
async function readByAsync(){
    let a1 = await read('1.txt');
    let a2 = await read('2.txt');
    let a3 = await read('3.txt');
    console.log(a1.toString());
    console.log(a2.toString());
    console.log(a3.toString());
}
readByAsync();

這個(gè)函數(shù)和generator函數(shù)有些類似银室,從例子中可以看得出來,async函數(shù)在function前面有個(gè)async作為標(biāo)識励翼,意思就是異步函數(shù)蜈敢,里面有個(gè)await搭配使用,每到await的地方就是程序需要等待執(zhí)行后面的程序汽抚,語義化很強(qiáng)抓狭,下面總結(jié)一下async函數(shù)的特點(diǎn)

  • 語義化強(qiáng)
  • 里面的await只能在async函數(shù)中使用
  • await后面的語句可以是promise對象、數(shù)字造烁、字符串等
  • async函數(shù)返回的是一個(gè)Promsie對象
  • await語句后的Promise對象變成reject狀態(tài)時(shí)否过,那么整個(gè)async函數(shù)會(huì)中斷午笛,后面的程序不會(huì)繼續(xù)執(zhí)行

基于上面的async的特點(diǎn),我們會(huì)用到異常捕獲機(jī)制苗桂,學(xué)過java的都知道药磺,java中有異常捕獲try...catch...

小白:這個(gè)東西是干什么的?
格格:下面讓我們來看一下它的概念

try/catch/finally 語句用于處理代碼中可能出現(xiàn)的錯(cuò)誤信息煤伟。
錯(cuò)誤可能是語法錯(cuò)誤癌佩,通常是程序員造成的編碼錯(cuò)誤或錯(cuò)別字。也 可能是拼寫錯(cuò)誤或語言中缺少的功能(可能由于瀏覽器差異)便锨。
try語句允許我們定義在執(zhí)行時(shí)進(jìn)行錯(cuò)誤測試的代碼塊驼卖。
catch 語句允許我們定義當(dāng) try 代碼塊發(fā)生錯(cuò)誤時(shí),所執(zhí)行的代碼塊鸿秆。
finally 語句在 try 和 catch 之后無論有無異常都會(huì)執(zhí)行。
注意: catch 和 finally 語句都是可選的怎囚,但你在使用 try 語句時(shí)必須至少使用一個(gè)卿叽。
提示: 當(dāng)錯(cuò)誤發(fā)生時(shí), JavaScript 會(huì)停止執(zhí)行恳守,并生成一個(gè)錯(cuò)誤信息考婴。使用 throw 語句 來創(chuàng)建自定義消息(拋出異常)。如果你將 throwtry 催烘、 catch一起使用沥阱,就可以控制程序輸出的錯(cuò)誤信息。

知道了這個(gè)東西是干什么的伊群,那么我們在async中怎么用呢考杉?

const fs = require("fs");
const read = function(fileName){
    return new Promise((resolve,reject)=>{
        fs.readFile(fileName,(err,data)=>{
            if (err) {
                reject(err);
            } else{
                resolve(data);
            }
        });
    });
};
async function readByAsync(){
    let a1;
    let a2;
    let a3;
    try{
        a1 = await read('1.txt');
        a2 = await read('2.txt');
        a3 = await read('3.txt');
    }catch(e){
        //TODO handle the exception
    }
    console.log(a1);
    console.log(a2);
    console.log(a3);
}
readByAsync();

大家看完了這個(gè)async是不是感覺還挺有用的啊,以后工作中async就會(huì)替代generator舰始,原理是Promise崇棠,所以說特別好用。

關(guān)于async函數(shù)我們都已經(jīng)了然于心丸卷,預(yù)知Set & Map數(shù)據(jù)結(jié)構(gòu)如何枕稀,請聽下回分解 (^?^)/~~~

本文的所有內(nèi)容均是一字一句敲上去的,希望大家閱讀完本文可以有所收獲谜嫉,因?yàn)槟芰τ邢尬溃莆盏闹R也是不夠全面,歡迎大家提出來一起分享沐兰!謝謝O(∩_∩)O~

歡迎訪問我的GitHub哆档,喜歡的可以star,項(xiàng)目隨意fork僧鲁,支持轉(zhuǎn)載但要下標(biāo)注虐呻,同時(shí)恭候:個(gè)人博客

等一下( ?? .? ?? )象泵,我還有最后一句話:
這里雖然沒有都市的繁華,
也沒有山林的鳥語花香斟叼,
只有一片如水的寧靜偶惠,
古人云:
既來之則安之,
既然來到了這里朗涩,
就可以靜心休憩你的靈魂忽孽,
調(diào)養(yǎng)你疲憊的心,
再見...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谢床,一起剝皮案震驚了整個(gè)濱河市兄一,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌识腿,老刑警劉巖出革,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渡讼,居然都是意外死亡骂束,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門成箫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來展箱,“玉大人,你說我怎么就攤上這事蹬昌』斐郏” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵皂贩,是天一觀的道長栖榨。 經(jīng)常有香客問我,道長先紫,這世上最難降的妖魔是什么治泥? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮遮精,結(jié)果婚禮上居夹,老公的妹妹穿的比我還像新娘。我一直安慰自己本冲,他們只是感情好准脂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪营罢。 梳的紋絲不亂的頭發(fā)上晕翠,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音蚓曼,去河邊找鬼祷安。 笑死唉地,一個(gè)胖子當(dāng)著我的面吹牛砾脑,可吹牛的內(nèi)容都是我干的幼驶。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼韧衣,長吁一口氣:“原來是場噩夢啊……” “哼盅藻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畅铭,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤氏淑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后硕噩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體假残,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年炉擅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了守问。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坑资,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出穆端,到底是詐尸還是另有隱情袱贮,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布体啰,位于F島的核電站攒巍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荒勇。R本人自食惡果不足惜柒莉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沽翔。 院中可真熱鬧兢孝,春花似錦、人聲如沸仅偎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橘沥。三九已至窗轩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間座咆,已是汗流浹背痢艺。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工仓洼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堤舒。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓色建,卻偏偏與公主長得像,于是被迫代替她去往敵國和親植酥。 傳聞我的和親對象是個(gè)殘疾皇子镀岛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 異步編程對JavaScript語言太重要。Javascript語言的執(zhí)行環(huán)境是“單線程”的友驮,如果沒有異步編程漂羊,根本...
    呼呼哥閱讀 7,302評論 5 22
  • async 函數(shù) 含義 ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便卸留。 async 函數(shù)是...
    huilegezai閱讀 1,258評論 0 6
  • 含義 ES2017標(biāo)準(zhǔn)引入了async函數(shù),使得異步操作變得更加方便.async函數(shù)其實(shí)就是Generator函數(shù)...
    JarvanZ閱讀 528評論 0 0
  • 簡單介紹下這幾個(gè)的關(guān)系為方便起見 用以下代碼為例簡單介紹下這幾個(gè)東西的關(guān)系走越, async 在函數(shù)聲明前使用asyn...
    _我和你一樣閱讀 21,216評論 1 24
  • 首先看一下下列代碼 var gen = function* (){var a = yield readFile()...
    c菜鳥閱讀 1,509評論 0 1