包括該提案異步 在ECMAScript中的功能已經達到第四階段; 這意味着它將在2017年發佈的標準。可是這對JavaScript開發者意味着什麼?javascript
有不少的利益在異步,JavaScript的須要並行輕鬆執行多種功能的能力。java
「由於JavaScript是單線程的,這意味着若是您有任何長時間運行工做,它必須是異步的爲您的應用程序保持響應或者它只是阻止和你的瀏覽器將凍結,說:」 安德斯·海爾斯伯格,C#的首席架構師如今也是一個核心開發人員爲微軟的打字稿transpiler 爲JavaScript。所以,JavaScript運行時庫和全部的框架被設計成只有異步的作事方式。若是你想作一個昂貴的操做,如XML HTTP請求,你不會阻塞和等待結果; 你獲得提供回調,稍後調用你的結果。編程
「那裏有很大的興奮; 人們都在期待時,他們可使用異步功能,而不transpilation,說:「 布賴恩Terlson,從微軟的邊緣球隊,誰是ECMAScript標準的編輯以及」關於異步提議冠軍「 TC39委員會的標準化的ECMAScript。當他推特,異步建議已經達到第四階段,它有更多的轉推比任何他的推文。後端
Follow
Brian Terlson @bterlson
Async functions are now stage 4 and will be included in ES2017!
8:47 AM - 29 Jul 2016
435 435 Retweets 552 552 likes
「異步編程模型容許開發人員當即提出他們全部的問題。而後開發人員對這些答案作出反應。該應用程序不斷適應,由於它來的信息,用戶體驗一個動態的應用程序,而不是被強迫等待一個無界的時間完美填妥的視圖更新本身,說:「 函數naveed Ihsanullah Mozilla的平臺工程團隊,部分是由於它將使代碼更容易理解。promise
「異步編程對於開發最佳用戶體驗很是重要。信息在許多地方,現代應用程序尋求將全部這些不一樣的來源無縫地集成到一個連貫的視圖中。然而,即時加載和完成的網頁都是幻覺。在幕後,表明用戶進行了大量的信息請求。其中一些是快速回答,有些可能須要更長時間。有些人可能徹底沒有回答,「他說。瀏覽器
整個網絡平臺正在這個方向移動,指出Terlson。異步 進入的ECMAScript 2017「的事實,即在平臺的東西愈來愈可能是異步的,因此你的代碼最終不得不面對更多的不一樣步的反映。與網絡工做者交談是一種異步的事情,任何種類的網絡。存儲API是異步的。服務工做者正在作一堆網絡東西,因此他們是異步的。新的流API有不少異步條吧。隨着新API的添加,咱們只是發現愈來愈多的異步源,由於平臺的能力增加,因此它滲透到你的代碼。網絡
添加異步API的增加意味着JavaScript須要在代碼中比回調更好的處理方式。「若是你只有一個異步源,一個回調是能夠的,但若是你有不少它的吸引力,這也是痛苦的性能緣由與許多功能建立和拋棄。」基本上,注意Terlson,在HTML 文檔對象模型 (DOM),一遍又一遍,效率不高。架構
使異步可承載
他認爲異步 做爲在回調的「巨大的進步」,由於「有金字塔的-厄運沒有嵌套回調」和Ihsanullah贊成。框架
「雖然異步編程有不少好處,可是以這種方式編寫應用程序一般很複雜和乏味。JavaScript語言已低電平異步設施,如XMLHttpRequest的,多年。這些低級的基於回調的構造很是難以使用,難以維護和難以調試。他們可能惡化的源代碼,以回調地獄多重嵌套的請求進行的。Asynct有障礙大大減小編寫高質量的維護異步代碼的潛力。這些開發者的好處直接轉換爲更響應的應用程序爲用戶,由於使用更多的異步。異步
在許多方面,這是JavaScript遇上其餘語言,如C#,它開創了異步編程,異步將在JavaScript中工做的方式很是相似於它在C#中處理,Hejlsberg說。這使得代碼更容易閱讀和思考。
「JavaScript是一個單線程執行環境。若是你想要任何事情發生因爲異步,你必須經過回調或有人必須打電話給你,由於只有一個執行線程。若是有人擁有它,他們必須放棄,讓你跑。因此從一開始,JavaScript的老是喜歡回調的setTimeout或相似DOM事件; 全部這一切發生的人打電話給你回來。
問題是代碼結構變得多麼複雜,有不少回調,以及使得它如何工做,Hejlsberg說。「邏輯每每變得更加複雜; 若是你必須有條件分支,或者你必須有等效的for循環,但在循環中間的異步調用?你能夠嘗試作本身的映射,你必須將你的狀態提高爲共享對象或共享變量並維護它,但你基本上必須本身寫一個狀態機。狀態機是計算機是很是好的推理,人類是可怕的推理!
Async負責處理,他解釋說。「事實證實,你能夠機械變換,它的使用CPS寫在常規順序風格融入異步代碼的代碼,繼續處理風格代碼重寫。你能夠重寫任何使用帶有返回的同步函數調用的程序,並將它們轉換爲接受回調的函數 - 這就是異步。你能夠編寫代碼,就像它是同步的,而後編譯器將它重寫爲基於異步回調的代碼,並將代碼轉換爲狀態機。
這是最好的方式來思考新的異步/等待功能,他建議。「在使用await操做符等待異步工做的地方,編譯器自動從其他代碼中調用回調。
「最大的好處是你可以以你本身的方式編寫代碼。若是你須要一個if語句,你寫一個if語句,若是你須要一個for循環你寫一個for循環,在裏面你能夠說await而後控制返回,而後回來,每當異步工做完成。人們都很是興奮,由於它使你的代碼看起來更清潔,它很容易推理你的代碼。
正如Terlson所說,「在大多數狀況下,你沒必要擔憂調用異步API的事實; 你只是等待它,去你的一天。若是promise被拒絕,你會獲得異步拋出的異步,因此你能夠寫異步代碼看起來像同步代碼和處理錯誤與正常的同步命令式代碼。
你仍然有重構。「當你使一個函數是一個異步函數,調用它的代碼獲得一個promise而不是一個值,因此你須要改變調用代碼async,以及等待結果。」可是這是更容易作async由於代碼自己不太複雜。「你甚至能夠等待非諾言。有一些API返回promises,但有時若是他們知道一個值同步他們只是返回它,因此若是你等待API結果正確的事情會發生。
可以使用這些熟悉的同步模式編寫代碼,同時得到異步的全部好處「大大簡化了爲動態和響應式Web應用程序編寫代碼」Ihsanullah說。他建議將其視爲「JavaScript承諾和生成器的句法包裝」,並指出「理解這些特性將極大地方便開發人員理解異步」,「承諾的經驗多是強制性的」。
瞭解異步及其相關函數await是基於generator和promise將幫助你處理更復雜的異步代碼,他說。「等待目前只容許一次等待一件事。然而,開發者意識到這些異步函數是promise,而後可使用await Promise.all(...)等待幾個動做。
瀏覽器準備異步
有一點,異步彷佛是一個有爭議的提案。Terlson解釋說:「有一些關因而否祝福的承諾,由於異步模式是正確的選擇,或者更像是能夠換掉其餘東西的任務。但在那個階段未曾有過超出了許多實現微軟的瀏覽器的邊緣(如開始早在2015年9月在邊緣13.10547試驗性的功能,並移動到沒有前綴的版本在Windows內幕預覽創建14986)。
「而後,谷歌的V8開始實現它,由於咱們獲得了更多的實施經驗,人們確信有沒有性能問題等等,這有助於。」
另外,解釋Ihsanullah,JavaScript須要那些構建模塊的異步:promises和generator。「雖然承諾,因爲能夠在JavaScript中實現,已經在瀏覽器中使用了幾年,生成器是最近的一種語言添加。」得到語法以反映開發人員使用函數的方式很重要。「它從箭頭開始。而後發電機。如今異步函數。對標準委員會和社會來講,語言的人體工程學是重要的。
如今異步功能在啓用了鍍鉻,由於鉻55(谷歌的傑克阿奇博爾德稱他們 「很是坦率地奇」),他們已經在Firefox中自2016年11月(該計劃是支持他們在Firefox 52)夜間釋放。歌劇院 42及更高版本支持異步,它是正在開發的Safari。
Transpilers
而像transpilers 巴貝爾和打字稿,你甚至能夠編寫異步代碼,有它在舊的瀏覽器中運行,以及做爲信心它會在最新的瀏覽器工做,由於他們增長的支持。
這是一個大量的工做,支持異步發電機沒有,這就是爲何它曾經只可能在打字稿到transpile異步代碼ECMAScript的2015年,和巴貝爾有着不一樣的技術 對其中的ECMAScript版本要根據目標。但如今TypeScript 2.1讓你一路回到ECMAScript 3,Hejlsberg說。
「一旦你將代碼重寫爲一個狀態機,若是你有生成器,那麼轉換是相對簡單的 - 重寫一個async函數,等待它到一個生成器幾乎是微不足道的。可是若是你沒有生成器,它是更復雜 - 由於如今你必須包圍一個狀態機在你的代碼周圍,有效地每一個地方,你看到等待,函數必須返回,而後當控制回來,它必須跳回並繼續執行。由於JavaScript中沒有gotos,這很複雜。因此你必須用一個switch語句寫一個while循環,而後保存一堆機器發明的狀態。在你的代碼發生的重寫是複雜的,獲得重寫正確並不簡單。
「使用TypeScript 2.1,咱們切換到新的發射器; 這是編譯器的後端。它是一個樹寫做者,重寫你的語法樹,以使這些新的狀態機和其餘奇怪的東西,你必須作,因此咱們如今支持重寫異步等待ECMAScript 3。它不僅是作簡單的狀況下,你只能使用在頂層等待,而不是在一個初始化或對象字面量的屬性 - 不,它是一個運算符像任何其餘,因此就像你能夠說加,你能夠說等。
瀏覽器和轉換器不是惟一須要支持異步的地方纔能成爲主流; 框架和庫也須要支持它。「若是你想寫異步風格的代碼,但你有一堆框架,不是那種風格,那些框架仍然會作回調,」他指出。「若是你有一個基於promise的庫,你正在編碼的異步工做。然而,一般,庫不是基於promise的,而後你必須promisify或找到一個promisified版本的相同的功能。這將是一個挑戰,由於這是將你從回調鏈接到異步世界的粘合劑。
期待着花時間發生。「與任何事情同樣,它不會在一晚上之間發生,但會有一個愈來愈漸進的變化和現代框架寫入如今將使用promises全部的異步 - 這意味着它將更容易使用異步代碼。這將是這個波,慢慢地洗過去,而不是發生在一晚上之間的東西。
宣佈異步將在ECMAScript 2017將有助於這一點。Terlson預測,圖書館做者必須在一段時間內完成異步操做,但他們如今能夠相信它是JavaScript的將來發展方向,因此他們可使用它,而沒必要擔憂它會被將來的語言變化所打破。
固然,編寫異步JavaScript對許多開發人員來講是新的。「若是你今天沒有使用轉換器,你沒有使用異步函數,」Terlson指出。任何已經使用async的人都是早期採用者,但隨着ECMAScript 2017向批准的方向發展,如今是開始考慮如何改進代碼的時候了。
原文連接