node異步使用await和不用await的區(qū)別實(shí)例分析
最近在用node寫項(xiàng)目。新版node異步用的是async/await這兩個(gè)關(guān)鍵字。我們都知道,一般這兩個(gè)關(guān)鍵字要成對(duì)出現(xiàn)。但是,筆者發(fā)現(xiàn),如果不需要等待返回值的話,await可以不加。那么await加和不加有什么區(qū)別呢?百度以及google了大量資料,結(jié)合評(píng)論,最終在實(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)行時(shí)間較長,所以B先執(zhí)行完成,整個(gè)過程沒有阻塞。
加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先完成,然后才會(huì)進(jìn)行事件B。也就是await不會(huì)阻塞同步事件的運(yùn)行,但是異步卻是一個(gè)一個(gè)執(zhí)行的,其中一個(gè)阻塞,下一個(gè)異步事件就無法繼續(xù)。
由于node.js異步事件執(zhí)行機(jī)制,各個(gè)事件的執(zhí)行順序帶有不確定性。因此,對(duì)于需要對(duì)執(zhí)行順序有要求的事件就需要謹(jǐn)慎使用同步與異步事件。
相關(guān)文章
在Node.js中使用Express實(shí)現(xiàn)視頻評(píng)論的列表展示和刪除功能
在現(xiàn)代Web應(yīng)用中,視頻內(nèi)容和互動(dòng)功能(如評(píng)論)的結(jié)合極大地增加了用戶的參與度,本文將通過一個(gè)具體的例子,展示如何在Node.js環(huán)境中使用Express框架來實(shí)現(xiàn)視頻評(píng)論的列表展示和刪除功能,需要的朋友可以參考下2024-04-04
前端pnpm?workspace架構(gòu)實(shí)例詳解
pnpm作為新一代包管理工具,解決了npm和yarn在依賴管理中的效率問題,它采用獨(dú)特的網(wǎng)狀+平鋪結(jié)構(gòu),顯著提升安裝速度并優(yōu)化磁盤空間,這篇文章主要介紹了前端pnpm?workspace架構(gòu)的相關(guān)資料,需要的朋友可以參考下2026-02-02
nodejs 實(shí)現(xiàn)釘釘ISV接入的加密解密方法
這篇文章主要介紹了nodejs 實(shí)現(xiàn)釘釘ISV接入的加密解密方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧,需要的朋友可以參考下2017-01-01
手寫Node靜態(tài)資源服務(wù)器的實(shí)現(xiàn)方法
這篇文章主要介紹了手寫Node靜態(tài)資源服務(wù)器的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
Nodejs 構(gòu)建Cluster集群多線程Worker threads
這篇文章主要為大家介紹了Nodejs 構(gòu)建Cluster集群多線程Worker threads示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
nodejs?express實(shí)現(xiàn)中間件
這篇文章主要為大家介紹了nodejs?express實(shí)現(xiàn)中間件實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
這篇文章主要介紹了node中Stream的詳細(xì)介紹,流是一個(gè)數(shù)據(jù)傳輸手段,是端到端信息交換的一種方式,而且是有順序的,是逐塊讀取數(shù)據(jù)、處理內(nèi)容,用于順序讀取輸入或?qū)懭胼敵?/div> 2022-09-09
用node和express連接mysql實(shí)現(xiàn)登錄注冊(cè)的實(shí)現(xiàn)代碼
本篇文章主要介紹了用node和express連接mysql實(shí)現(xiàn)登錄注冊(cè)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07最新評(píng)論

