JavaScript中的非同步能省掉await嗎?
之前我知道要在中同步獲取非同步執行的結果,必須帶
await
;在for迴圈中,如果不用Promise.All的話,非同步不起效果。但是每次需要等待執行結果的時候,都需要帶async
和await
,我覺得老麻煩了,也不好看。如果記住了這兩個單詞的寫法倒還好,沒記住的話每次拼錯,能把思路打斷,忽然冒出這樣的單詞,也不美觀。
於是我就一致致力於解決這個問題,作為一個經常以造輪子為自豪的程式設計師,我認為我有責任為Script
的改變做出一點小小的貢獻。
請看下面這段程式碼:
const trans = require('node-google-translate-skidz'); function translate (str,strEn,tarEn) { let p = () => { return new Promise((resolve,reject) => { trans({ text: str,source: strEn ? strEn : 'zh',target: tarEn ? tarEn : 'en' },function (result) { resolve(result.translation) }); }) } let an = async () => { let b = await p() console.log(b); } return an() //console.log(b) } let c = translate('中文') console.log('c',c)
這段程式碼可能是我能想出最好的,解決非同步問題的方案了,答案依然沒有成功。但我終於知道為什麼JavaScript
中,不管你如何包裹,用什麼技術都無法真正避免async
和await
了。
看translate方法呼叫的地方,呼叫完之後列印翻譯的結果。這麼做的目的,我當然是希望有結果之後列印了,如果列印WMgap的是Promise { <pending> },
那說明沒有等待就直接執行了。
為了達到有結果之後再列印的目的,我在translate
方法中自作聰明地封裝了一道async()=>{await},
然後讓translate
返回await
執行的結果。但是這個方法不會起到任何作用,因為最後列印的結果仍然是我想要竭盡全力避免的
為什麼呢?因為我搞忘了async
只對function
起作用,也就是說async
是有作用域的。在我執行了let c = translate('中文')
這個方法之後,因為我沒有告訴編譯器translate
需要await(我自以為translate內部已經實現了async
和await
,那麼translate
就會自動等待執行結果返回。但是因為有作用域的存在,translate內部的作用域是無法影響到translate
方法執行的這一層面上的。),所以編譯器還是直接執行了console.log('c',c)
,也就是列印了Promise
{ <pendiWMgapng> }。
通過引入作用域這個概念,方法體的async
await
無法使方法呼叫這個層級也async
、await
,你大概就能理解JavaScript
中,為什麼非同步無法省略await了。
到此這篇關於JavaScriptwww.cppcns.com中的非同步能省掉await嗎?的文章就介紹到這了,更多相關JavaScript中的非同步內容請搜尋我們www.cppcns.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!