2017-05-25 275 views
2

爲什麼使用await需要將其外部功能聲明爲asyncJS異步/等待 - 爲什麼等待需要異步?

例如,爲什麼這個mongoose語句需要它返回promise的函數?

async function middleware(hostname, done) { 
    try { 
    let team = await Teams.findOne({ hostnames: hostname.toLowerCase() }).exec(); 
    done(null, team); 
    } catch (err) { done(err); } 
} 

我看到運行時/轉譯器解析團隊承諾它的價值和異步信號它「拋出」拒絕承諾。

但嘗試/抓住「捕捉」那些被拒絕的承諾,那麼爲什麼異步和等待如此緊密耦合?

+0

我不明白你的意思是「*但是嘗試/趕上」捕獲「那些被拒絕的承諾*」。這與'async'關鍵字有什麼關係? – Bergi

+0

[爲什麼需要使用async關鍵字](https://stackoverflow.com/a/31485350/1048572)可能存在重複? – Bergi

+0

「*爲什麼這個mongoose語句需要它返回promise的函數?*」 - 如何能等待貓鼬承諾的異步結果呢? – Bergi

回答

0

通過@phaux從https://stackoverflow.com/a/41744179/1483977複製:

這些答案都給予爲什麼async關鍵字是 好事,但它們都沒有真正提到的真正原因是 了有效參數被添加到規範。

的原因是,這是一個有效的JS預ES7

function await(x) { 
    return 'awaiting ' + x 
} 

function foo() { 
    return(await(42)) 
} 

按照你的邏輯,會foo()返回Promise{42}"awaiting 42"? (返回承諾將向後兼容 打破)

所以答案是:await是常規標識符,它只是作爲 內異步功能的關鍵字處理,所以他們必須以某種方式標記 。有趣的事實:原始規範提出異步語法更輕量級function^ foo() {}

3

我並不瞭解JavaScript語言的設計討論,但我認爲這是出於同樣的原因是theC#languagerequiresasync(見my blog)。

即:

  1. 向後兼容性。如果await在任何地方突然都是新的關鍵字,那麼任何使用await作爲變量名的現有代碼都會中斷。由於await是上下文關鍵字(由async激活),只有意圖await用作關鍵字的代碼將具有await作爲關鍵字。
  2. 更容易解析。 async使異步代碼更易於解析轉譯器,瀏覽器,工具和人員。