1. 程式人生 > 程式設計 >JavaScript中的非同步能省掉await嗎?

JavaScript中的非同步能省掉await嗎?

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

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

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

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

JavaScript中的非同步能省掉await嗎?

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

通過引入作用域這個概念,方法體的async

await無法使方法呼叫這個層級也asyncawait,你大概就能理解JavaScript中,為什麼非同步無法省略await了。

到此這篇關於JavaScriptwww.cppcns.com中的非同步能省掉await嗎?的文章就介紹到這了,更多相關JavaScript中的非同步內容請搜尋我們www.cppcns.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!