node異步使用await和不用await的區(qū)別實例分析
最近在用node寫項目。新版node異步用的是async/await這兩個關(guān)鍵字。我們都知道,一般這兩個關(guān)鍵字要成對出現(xiàn)。但是,筆者發(fā)現(xiàn),如果不需要等待返回值的話,await可以不加。那么await加和不加有什么區(qū)別呢?百度以及google了大量資料,結(jié)合評論,最終在實踐中弄明白了。下面直接上例子。
不加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)
? ? })
? }運行test函數(shù)以后,命令行迅速依次打印了如下結(jié)果

我們看到,沒有加await,異步函數(shù)A,B順序執(zhí)行,由于A運行時間較長,所以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)
? ? })
? }運行結(jié)果如下 :

由于加了await,所以要等待異步事件A先完成,然后才會進行事件B。也就是await不會阻塞同步事件的運行,但是異步卻是一個一個執(zhí)行的,其中一個阻塞,下一個異步事件就無法繼續(xù)。
由于node.js異步事件執(zhí)行機制,各個事件的執(zhí)行順序帶有不確定性。因此,對于需要對執(zhí)行順序有要求的事件就需要謹慎使用同步與異步事件。
相關(guān)文章
在Node.js中使用Express實現(xiàn)視頻評論的列表展示和刪除功能
在現(xiàn)代Web應(yīng)用中,視頻內(nèi)容和互動功能(如評論)的結(jié)合極大地增加了用戶的參與度,本文將通過一個具體的例子,展示如何在Node.js環(huán)境中使用Express框架來實現(xiàn)視頻評論的列表展示和刪除功能,需要的朋友可以參考下2024-04-04
手寫Node靜態(tài)資源服務(wù)器的實現(xiàn)方法
這篇文章主要介紹了手寫Node靜態(tài)資源服務(wù)器的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
Nodejs 構(gòu)建Cluster集群多線程Worker threads
這篇文章主要為大家介紹了Nodejs 構(gòu)建Cluster集群多線程Worker threads示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
這篇文章主要介紹了node中Stream的詳細介紹,流是一個數(shù)據(jù)傳輸手段,是端到端信息交換的一種方式,而且是有順序的,是逐塊讀取數(shù)據(jù)、處理內(nèi)容,用于順序讀取輸入或?qū)懭胼敵?/div> 2022-09-09
用node和express連接mysql實現(xiàn)登錄注冊的實現(xiàn)代碼
本篇文章主要介紹了用node和express連接mysql實現(xiàn)登錄注冊的實現(xiàn)代碼,具有一定的參考價值,有興趣的可以了解一下2017-07-07最新評論

