2016-02-26 79 views
5

例如,爲什麼下面的函數需要「async」..沒有使用足夠的編譯器來解析代碼而沒有歧義?爲什麼JavaScript函數需要關鍵字「異步」? 「await」關鍵字不夠嗎?

# Why do we need async here 
async function foo() { 
    var user = await getUser(user_id); 
    console.log(user); 
} 

它是出於向下兼容性的原因嗎? (我想不出任何使用標準Javascript中的await鍵盤的代碼..)?

主要是爲了清楚起見,說清楚這個函數使用了新的async關鍵字嗎? 感謝

+1

我只能想象它使解析更容易.... –

+1

在這個例子中,它沒有多大意義。你正在異步運行一些東西,然後告訴它等待getUser的結果。在更大的功能範圍內它可能更有意義。 – Neil

+0

您可能會發現這個博客很有用:https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html我同意這可能是一個解析問題。在博客中:「當一個函數被聲明爲async時,它就能夠執行到調用代碼,而它正在等待一個承諾被解決。」 – scrappedcola

回答

6

從語言的角度來看,async/await關鍵字在JavaScript設計非常密切合作,他們在C#中的工作方式。

我有一篇舊的博客文章,描述了爲什麼async明確添加到C#中:see Inferring "async" here。簡而言之,添加關鍵字是語言潛在的重大改變;想象一個使用var await = false;或者其他類型的應用程序。

或者,對於這可能更模糊的示例,var await = function() {};,其將被用作await (x);。看看await (x);的使用情況,編譯器將很難決定哪種表達方式。你可能會認爲await是一個關鍵字,除非這個名稱的範圍內有一個變量,但會變得非常多毛。

更清潔的解決方案是引入關鍵字,所以async(其只用於功能和lambda表達式,並且是沒有歧義)使await關鍵字,但只在該範圍內。有function*表示發電機,而不僅僅是存在yield有類似的好處。

這不僅更加明確(維護與使用await其他的東西代碼向後兼容),但它也是兩個軟件人類解析更容易。

相關問題