node異步使用await和不用await的區(qū)別實(shí)例分析
最近在用node寫項(xiàng)目。新版node異步用的是async/await這兩個關(guān)鍵字。我們都知道,一般這兩個關(guān)鍵字要成對出現(xiàn)。但是,筆者發(fā)現(xiàn),如果不需要等待返回值的話,await可以不加。那么await加和不加有什么區(qū)別呢?百度以及google了大量資料,結(jié)合評論,最終在實(shí)踐中弄明白了。下面直接上例子。
不加await
async test(ctx,next){ ? ? this.doThing().then(console.log('done Thing')) ? ? this.doAnotherThing(); ? ? console.log('this way'); ? } ? async doThing() { ? ? this.doA(); ? ? this.doB(); ? } ? doAnotherThing() { ? ? console.log('do another thing') ? } ? async doA() { ? ? return new Promise(resove => { ? ? ? setTimeout(() => { ? ? ? ? console.log('done A') ? ? ? ? resove() ? ? ? }, 1000) ? ? }) ? } ? async doB() { ? ? return new Promise(resove => { ? ? ? setTimeout(() => { ? ? ? ? console.log('done B') ? ? ? ? resove() ? ? ? }, 100) ? ? }) ? }
運(yùn)行test函數(shù)以后,命令行迅速依次打印了如下結(jié)果
我們看到,沒有加await,異步函數(shù)A,B順序執(zhí)行,由于A運(yùn)行時間較長,所以B先執(zhí)行完成,整個過程沒有阻塞。
加await
async test(ctx,next){ ? ? this.doThing().then(console.log('done Thing')) ? ? this.doAnotherThing(); ? ? console.log('this way'); ? } ? async doThing() { ? ? await this.doA() ? ? await this.doB() ? } ? doAnotherThing() { ? ? console.log('do another thing') ? } ? async doA() { ? ? return new Promise(resove => { ? ? ? setTimeout(() => { ? ? ? ? console.log('done A') ? ? ? ? resove() ? ? ? }, 1000) ? ? }) ? } ? async doB() { ? ? return new Promise(resove => { ? ? ? setTimeout(() => { ? ? ? ? console.log('done B') ? ? ? ? resove() ? ? ? }, 100) ? ? }) ? }
運(yùn)行結(jié)果如下 :
由于加了await,所以要等待異步事件A先完成,然后才會進(jìn)行事件B。也就是await不會阻塞同步事件的運(yùn)行,但是異步卻是一個一個執(zhí)行的,其中一個阻塞,下一個異步事件就無法繼續(xù)。
由于node.js異步事件執(zhí)行機(jī)制,各個事件的執(zhí)行順序帶有不確定性。因此,對于需要對執(zhí)行順序有要求的事件就需要謹(jǐn)慎使用同步與異步事件。
相關(guān)文章
初學(xué)者如何快速搭建Express開發(fā)系統(tǒng)步驟詳解
這篇文章主要介紹了初學(xué)者如何快速搭建Express開發(fā)系統(tǒng),結(jié)合實(shí)例形式詳細(xì)分析了express框架搭建的具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2023-05-05使用NVM實(shí)現(xiàn)不同nodejs版本的自由切換
在工作中,我們可能需要同時進(jìn)行多個不同NodeJS版本的項(xiàng)目開發(fā),這種情況下,對于維護(hù)多個版本的node將會是一件非常麻煩的事情,NVM就是為解決這個問題而產(chǎn)生的,本文給出了下載、安裝及使用方法,需要的朋友可以參考下2024-02-02Node.js實(shí)戰(zhàn)之Buffer和Stream模塊系統(tǒng)深入剖析詳解
這篇文章主要介紹了Node.js實(shí)戰(zhàn)之Buffer和Stream模塊系統(tǒng)深入剖析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08node靜態(tài)服務(wù)器實(shí)現(xiàn)靜態(tài)讀取文件或文件夾
這篇文章主要介紹了node靜態(tài)服務(wù)器實(shí)現(xiàn)靜態(tài)讀取文件或文件夾,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12使用koa2創(chuàng)建web項(xiàng)目的方法步驟
這篇文章主要介紹了使用koa2創(chuàng)建web項(xiàng)目的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03nodejs微信開發(fā)之授權(quán)登錄+獲取用戶信息
這篇文章主要介紹了nodejs微信開發(fā)之授權(quán)登錄+獲取用戶信息,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03