HTML5技術分享 ES2017繼發與並發 -开发者知识库

HTML5技術分享 ES2017繼發與並發 -开发者知识库,第1张

       大家都知道,async函數的返回值是 Promise 對象,這比 Generator 函數的返回值是 Iterator 對象方便多了。你可以用then方法指定下一步的操作。

  進一步說,async函數完全可以看作多個異步操作,包裝成的一個 Promise 對象,而await命令就是內部then命令的語法糖。

  先來看一段代碼:

HTML5技術分享 ES2017繼發與並發 -开发者知识库,第2张 

  函數f內部return命令返回的值,會被then方法回調函數接收到。

HTML5技術分享 ES2017繼發與並發 -开发者知识库,第3张 

  只有async函數內部的異步操作執行完,才會執行then方法指定的回調函數,wait后面要給個promise對象,也會返回promise對象。

 HTML5技術分享 ES2017繼發與並發 -开发者知识库,第4张

  需要注意的事:

  (1)await命令后面的Promise對象,運行結果可能是rejected,所以最好把await命令放在try...catch代碼塊中。

HTML5技術分享 ES2017繼發與並發 -开发者知识库,第5张 

  (2)多個await命令后面的異步操作,如果不存在繼發關系,最好讓它們同時觸發。

HTML5技術分享 ES2017繼發與並發 -开发者知识库,第6张 

  (3)await命令只能用在async函數之中,如果用在普通函數,就會報錯。

  順序繼發異步處理

  先封裝一個getData的函數,用來ajax讀取數據,並返回promise對象。

 HTML5技術分享 ES2017繼發與並發 -开发者知识库,第7张

  之后我們需要分別依次從多個數據文件里面讀取數據,再依次拼裝到新對象中。

HTML5技術分享 ES2017繼發與並發 -开发者知识库,第8张 

  有可能數據讀取不到,需要處理錯誤,繼而程序不中斷。

HTML5技術分享 ES2017繼發與並發 -开发者知识库,第9张 

  或者是用try..catch處理, 有時,我們希望即使前一個異步操作失敗,也不要中斷后面的異步操作。這時可以將第一個await放在try...catch結構里面,這樣不管這個異步操作是否成功,第二個await都會執行。

HTML5技術分享 ES2017繼發與並發 -开发者知识库,第10张 

  並發異步處理

  繼發關系比較耗時,因為只有前一個await完成以后,才會執行后一個await,完全可以讓它們同時觸發。

HTML5技術分享 ES2017繼發與並發 -开发者知识库,第11张 

  同樣有可能數據讀取不到,需要處理錯誤,繼而程序不中斷。

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复