JavaScript中的異步能省掉await嗎?
之前我知道要在JavaScript
中同步獲取異步執行的結果,必須帶await
;在for循環中,如果不用Promise.All的話,異步不起效果。但是每次需要等待執行結果的時候,都需要帶async
和await
,我覺得老麻煩瞭,也不好看。如果記住瞭這兩個單詞的寫法倒還好,沒記住的話每次拼錯,能把思路打斷,忽然冒出這樣的單詞,也不美觀。
於是我就一致致力於解決這個問題,作為一個經常以造輪子為自豪的程序員,我認為我有責任為JavaScript
的改變做出一點小小的貢獻。
請看下面這段代碼:
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方法調用的地方,調用完之後打印翻譯的結果。這麼做的目的,我當然是希望有結果之後打印瞭,如果打印的是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
{ <pending> }。
通過引入作用域這個概念,方法體的async
、await
無法使方法調用這個層級也async
、await
,你大概就能理解JavaScript
中,為什麼異步無法省略await瞭。
到此這篇關於JavaScript中的異步能省掉await嗎?的文章就介紹到這瞭,更多相關JavaScript中的異步內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JavaScript詳解使用Promise處理回調地獄與async await修飾符
- vue中Promise的使用方法詳情
- JS中的async與await怎麼使用
- 徹底搞懂 javascript的Promise
- Vue中的同步調用和異步調用方式