JavaScript中的異步能省掉await嗎?

之前我知道要在JavaScript中同步獲取異步執行的結果,必須帶await;在for循環中,如果不用Promise.All的話,異步不起效果。但是每次需要等待執行結果的時候,都需要帶asyncawait,我覺得老麻煩瞭,也不好看。如果記住瞭這兩個單詞的寫法倒還好,沒記住的話每次拼錯,能把思路打斷,忽然冒出這樣的單詞,也不美觀。

於是我就一致致力於解決這個問題,作為一個經常以造輪子為自豪的程序員,我認為我有責任為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中,不管你如何包裹,用什麼技術都無法真正避免asyncawait瞭。

看translate方法調用的地方,調用完之後打印翻譯的結果。這麼做的目的,我當然是希望有結果之後打印瞭,如果打印的是Promise { <pending> },那說明沒有等待就直接執行瞭。

為瞭達到有結果之後再打印的目的,我在translate方法中自作聰明地封裝瞭一道async()=>{await}, 然後讓translate返回await執行的結果。但是這個方法不會起到任何作用,因為最後打印的結果仍然是我想要竭盡全力避免的

為什麼呢?因為我搞忘瞭async隻對function起作用,也就是說async是有作用域的。在我執行瞭let c = translate('中文')這個方法之後,因為我沒有告訴編譯器translate需要await(我自以為translate內部已經實現瞭asyncawait,那麼translate就會自動等待執行結果返回。但是因為有作用域的存在,translate內部的作用域是無法影響到translate方法執行的這一層面上的。),所以編譯器還是直接執行瞭console.log('c', c) ,也就是打印瞭Promise { <pending> }。

通過引入作用域這個概念,方法體的asyncawait無法使方法調用這個層級也asyncawait,你大概就能理解JavaScript中,為什麼異步無法省略await瞭。

到此這篇關於JavaScript中的異步能省掉await嗎?的文章就介紹到這瞭,更多相關JavaScript中的異步內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: