精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何使用Await減少回調(diào)嵌套

開發(fā) 開發(fā)工具
Promise提供了一個(gè)resolve,方便通知什么時(shí)候異步結(jié)束了,不過本質(zhì)還是一樣的,還是使用回調(diào),只是這個(gè)回調(diào)放在了then里面。

 [[210217]]

在開發(fā)的時(shí)候,有時(shí)候需要發(fā)很多請求,然后經(jīng)常會面臨嵌套回調(diào)的問題,即在一個(gè)回調(diào)里面又嵌了一個(gè)回調(diào),導(dǎo)致代碼層層縮進(jìn)得很厲害,如下代碼所示:

  1. ajax({ 
  2.     url: "/list"
  3.     type: "GET"
  4.     success: function(data) { 
  5.        appendToDOM(data); 
  6.         ajax({ 
  7.             url: "/update"
  8.             type: "POST"
  9.             success: function(data) { 
  10.                 util.toast("Success!"); 
  11.             }) 
  12.         }); 
  13.     } 
  14. }); 

這樣的代碼看起來有點(diǎn)吃力,這種異步回調(diào)通常可以用Promise優(yōu)化一下,可以把上面代碼改成:

  1. new Promise(resolve => { 
  2.     ajax({ 
  3.         url: "/list"
  4.         type: "GET"
  5.         success: data => resolve(data); 
  6.     }) 
  7. }).then(data => { 
  8.    appendToDOM(data); 
  9.     ajax({ 
  10.         url: "/update"
  11.         type: "POST"
  12.         success: function(data) { 
  13.             util.toast("Successfully!"); 
  14.         })   
  15.     });  
  16. }); 

Promise提供了一個(gè)resolve,方便通知什么時(shí)候異步結(jié)束了,不過本質(zhì)還是一樣的,還是使用回調(diào),只是這個(gè)回調(diào)放在了then里面。

當(dāng)需要獲取多次異步數(shù)據(jù)的時(shí)候,可以使用Promise.all解決:

  1. let orderPromise = new Promise(resolve => { 
  2.     ajax("/order""GET", data => resolve(data)); 
  3. }); 
  4. let userPromise = new Promise(resolve => { 
  5.     ajax("/user""GET", data => resolve(data)); 
  6. }); 
  7.   
  8. Promise.all([orderPromise, userPromise]).then(values => { 
  9.     let order = values[0], 
  10.          user = values[1]; 
  11. }); 

但是這里也是使用了回調(diào),有沒有比較優(yōu)雅的解決方式呢?

ES7的await/async可以讓異步回調(diào)的寫法跟寫同步代碼一樣。***個(gè)嵌套回調(diào)的例子可以用await改成下面的代碼:

  1. // 使用await獲取異步數(shù)據(jù) 
  2. let leadList = await new Promise(resolve => { 
  3.     ajax({ 
  4.         url: "/list"
  5.         type: "GET"
  6.         success: data => resolve(data); 
  7.     }); 
  8. }); 
  9.   
  10. // await讓代碼很自然地像瀑布流一樣寫下來  
  11. appendToDom(leadList); 
  12. ajax({ 
  13.     url: "/update"
  14.     type: "POST"
  15.     success: () => util.toast("Successfully"); 
  16. }); 

Await讓代碼可以像瀑布流一樣很自然地寫下來。

第二個(gè)例子:獲取多次異步數(shù)據(jù),可以改成這樣:

  1. let order = await new Promise( 
  2.            resolve => ajax("/order", data => resovle(data))), 
  3.   
  4.     user = await new Promise( 
  5.            resolve => ajax("/user", data => resolve(data))); 
  6.   
  7. // do sth. with order/user 

這種寫法就好像從本地獲取數(shù)據(jù)一樣,就不用套回調(diào)函數(shù)了。

Await除了用在發(fā)請求之外,還適用于其它異步場景,例如我在創(chuàng)建訂單前先彈一個(gè)小框詢問用戶是要創(chuàng)建哪種類型的訂單,然后再彈具體的設(shè)置訂單的框,所以按正常思路這里需要傳遞一個(gè)按鈕回調(diào)的點(diǎn)擊函數(shù),如下圖所示:

 

但其實(shí)可以使用await解決,如下代碼所示:

  1. let quoteHandler = require("./quote"); 
  2. // 彈出框詢問用戶并得到用戶的選擇 
  3. let createType = await quoteHandler.confirmCreate(); 

quote里面返回一個(gè)Promise,監(jiān)聽點(diǎn)擊事件,并傳遞createType:

  1. let quoteHandler = { 
  2.     confirmCreate: function(){ 
  3.         dialog.showDialog({ 
  4.             contentTpl: tpl, 
  5.             className: "confirm-create-quote" 
  6.         }); 
  7.         let $quoteDialog = $(".confirm-create-quote form")[0]; 
  8.         return new Promise(resolve => { 
  9.             $(form.submit).on("click"function(event){ 
  10.                 resolve(form.createType.value); 
  11.             }); 
  12.         }); 
  13.     } 
  14.   

這樣外部調(diào)用者就可以使用await,而不用傳遞一個(gè)點(diǎn)擊事件的回調(diào)函數(shù)了。

但是需要注意的是await的一次性執(zhí)行特點(diǎn)。相對于回調(diào)函數(shù)來說,await的執(zhí)行是一次性的,例如監(jiān)聽點(diǎn)擊事件,然后使用await,那么點(diǎn)擊事件只會執(zhí)行一次,因?yàn)榇a從上往下執(zhí)行完了,所以當(dāng)希望點(diǎn)擊之后出錯(cuò)了還能繼續(xù)修改和提交就不能使用await,另外使用await獲取異步數(shù)據(jù),如果出錯(cuò)了,那么成功的resolve就不會執(zhí)行,后續(xù)的代碼也不會執(zhí)行,所以請求出錯(cuò)的時(shí)候基本邏輯不會有問題。

要在babel里面使用await,需要:

(1)安裝一個(gè)Node包

  1. npm install –save-dev babel-plugin-transform-async-to-generator 

(2)在工程的根目錄添加一個(gè).babelrc文件,內(nèi)容為:

  1.   "plugins": ["transform-async-to-generator"

(3)使用的時(shí)候先引入一個(gè)模塊

  1. require("babel-polyfill"); 

然后就可以愉快地使用ES7的await了。

使用await的函數(shù)前面需要加上async關(guān)鍵字,如下代碼:

  1. async showOrderDialog() { 
  2.      // 獲取創(chuàng)建類型 
  3.      let createType = await quoteHandler.confirmCreate(); 
  4.   
  5.      // 獲取老訂單數(shù)據(jù)  
  6.      let orderInfo = await orderHandler.getOrderData(); 

我們再舉一個(gè)例子:使用await實(shí)現(xiàn)JS版的sleep函數(shù),因?yàn)樵菦]有提供線程休眠函數(shù)的,如下代碼所示:

  1. function sleep (time) { 
  2.     return new Promise(resolve =>  
  3.                           setTimeout(() => resolve(), time)); 
  4.   
  5. async function start () { 
  6.     await sleep(1000); 
  7.   
  8. start(); 

babel的await實(shí)現(xiàn)是轉(zhuǎn)成了ES6的generator,如下關(guān)鍵代碼:

  1. while (1) { 
  2.     switch (_context.prev = _context.next) { 
  3.         case 0: 
  4.             _context.next = 2; 
  5.             // sleep返回一個(gè)Promise對象 
  6.             return sleep(1000); 
  7.   
  8.         case 2: 
  9.         case "end":      
  10.             return _context.stop(); 
  11.     } 

而babel的generator也是要用ES5實(shí)現(xiàn)的,什么是generator呢?如下圖所示:

 

生成器用function*定義,每次執(zhí)行生成器的next函數(shù)的時(shí)候會返回當(dāng)前生成器里用yield返回的值,然后生成器的迭代器往后走一步,直到所有yield完了。

有興趣的可以繼續(xù)研究babel是如何把ES7轉(zhuǎn)成ES5的,據(jù)說原生的實(shí)現(xiàn)還是直接基于Promise.

使用await還有一個(gè)好處,可以直接try-catch捕獲異步過程拋出的異常,因?yàn)槲覀兪遣荒苤苯硬东@異步回調(diào)里面的異常的,如下代碼:

  1. let quoteHandler = { 
  2.     confirmCreate: function(){ 
  3.         $(form.submit).on("click"function(event){ 
  4.             // 這里會拋undefined異常:訪問了undefined的value屬性 
  5.             callback(form.notFoundInput.value); 
  6.         }); 
  7.     } 
  8.   
  9. try { 
  10.     // 這里無法捕獲到異常 
  11.     quoteHandler.confirmCreate(); 
  12. } catch (e) { 
  13.   

上面的try-catch是沒有辦法捕獲到異常的,因?yàn)閠ry里的代碼已經(jīng)執(zhí)行完了,在它執(zhí)行的過程中并沒有異常,因此無法在這里捕獲,如果使用Promise的話一般是使用Promise鏈的catch:

  1. let quoteHandler = { 
  2.     confirmCreate: function(){ 
  3.         return new Promise(resolve => { 
  4.             $(form.submit).on("click"function(event){ 
  5.                 // 這里會拋undefined異常:訪問了undefined的value屬性 
  6.                 resolve(form.notFoundInput.value); 
  7.             }); 
  8.         }); 
  9.     } 
  10.   
  11. quoteHandler.confirmCreate().then(createType => { 
  12.   
  13. }).catch(e => { 
  14.     // 這里能捕獲異常 
  15. }); 

而使用await,我們可以直接用同步的catch,就好像它真的變成同步執(zhí)行了:

  1. try { 
  2.     createType = await quoteHandler.confirmCreate("order"); 
  3. }catch(e){ 
  4.     console.log(e); 
  5.     return

總之使用await讓代碼少寫了很多嵌套,很方便的邏輯處理,縱享絲滑。

原文鏈接:https://fed.renren.com/2017/10/31/await/

【本文是51CTO專欄作者“人人網(wǎng)FED”的原創(chuàng)稿件,轉(zhuǎn)載請通過51CTO聯(lián)系原作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2021-06-07 09:44:10

JavaScript開發(fā)代碼

2009-12-22 19:00:08

WCF回調(diào)

2011-05-20 17:19:25

回調(diào)函數(shù)

2009-11-16 17:15:12

Oracle減少回滾段

2009-08-19 17:10:09

C#回調(diào)函數(shù)

2009-11-09 15:58:07

WCF回調(diào)方法

2021-12-27 10:13:51

Goatomic數(shù)據(jù)競爭

2024-11-25 07:00:00

箭頭函數(shù)JavaScriptReact

2023-08-01 07:27:42

Mockito測試Callback

2010-03-01 15:12:53

WCF回調(diào)契約

2012-02-01 10:33:59

Java

2013-04-12 09:57:37

CSSJavaScript

2021-03-10 09:20:31

await代碼前端

2012-07-22 15:59:42

Silverlight

2009-08-19 16:40:35

C#回調(diào)

2015-10-26 09:25:42

2009-08-21 17:02:20

ASP.NET異步回調(diào)

2023-11-10 16:31:31

2009-08-12 10:11:18

C# 回調(diào)函數(shù)

2022-04-12 08:30:52

回調(diào)函數(shù)代碼調(diào)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

国产高清一区二区三区视频| 中国女人一级一次看片| 国产精品白丝一区二区三区| 香蕉乱码成人久久天堂爱免费| 久久精品日韩精品| 99成人精品视频| 91亚洲自偷观看高清| 日韩三级视频在线看| 国产一区二区视频播放| 成年人视频在线免费观看| 国产精品一二三四五| 欧洲永久精品大片ww免费漫画| 亚洲天堂精品一区| 韩国女主播一区二区三区| 欧美亚洲高清一区二区三区不卡| 超碰10000| www在线播放| av一区二区不卡| 91老司机在线| 久久久999久久久| 亚洲小说欧美另类婷婷| 日韩中文字幕在线| 四虎精品一区二区| 中文成人在线| 在线免费观看视频一区| 成人免费毛片在线观看| 麻豆网站在线免费观看| 国产亚洲欧美色| 精品国产一区二区三区久久久久久| 91久久精品国产91性色69| 一本色道久久精品| 欧美日韩xxx| 免费精品在线视频| 成人黄色av| 亚洲欧美国产精品专区久久| 欧美一级片黄色| 精品一区视频| 欧美剧在线免费观看网站| 国内外免费激情视频| 免费高潮视频95在线观看网站| 最新成人av在线| 亚洲精品国产一区| h视频在线免费| 久久精品日产第一区二区三区高清版| 国内精品**久久毛片app| 午夜精品一区二区三| 国产主播一区二区三区| 国产欧美日韩视频| 一区二区自拍偷拍| 麻豆精品国产91久久久久久| 国产精品第10页| 国产suv精品一区二区33| 亚洲欧美日本国产专区一区| 欧美一二三视频| 久久久久99精品成人片我成大片 | 婷婷四房综合激情五月| 色网站在线免费观看| 91亚洲资源网| 免费看成人片| 国产免费a∨片在线观看不卡| 国产亚洲综合色| 日韩av一级大片| 国产二区视频在线观看| 亚洲欧洲日产国产综合网| 国产一区一区三区| 日韩电影免费观看| 偷窥国产亚洲免费视频| 成人在线免费在线观看| 亚洲伦理影院| 欧美精品久久一区| 无码人妻久久一区二区三区蜜桃| 国产欧美自拍一区| 亚洲欧美在线免费| 制服丨自拍丨欧美丨动漫丨| 亚洲国产一成人久久精品| 欧美国产日韩二区| 亚洲天堂av片| 久久精品国产一区二区| 亚洲自拍偷拍网址| 污污视频在线免费看| 久久久www成人免费毛片麻豆| 亚洲国产日韩综合一区| √天堂8在线网| 黑丝美女久久久| 久久黄色片网站| 欧美日韩一区二区三区四区不卡 | 精品亚洲成av人在线观看| 亚洲一区二区三| 日本精品一二区| 国产欧美日韩另类一区| 国内精品国产三级国产99| 色黄视频在线观看| 制服丝袜亚洲网站| 亚洲一区二区在线免费| 久久高清免费| 性欧美亚洲xxxx乳在线观看| 中文字幕乱伦视频| 国产91综合网| 日韩电影大全在线观看| 中文在线免费| 91久久香蕉国产日韩欧美9色| 激情在线观看视频| 亚洲v天堂v手机在线| 久久夜精品香蕉| 国产99免费视频| 国产成人综合精品三级| 久久精品二区| 在线欧美三级| 欧美日韩在线直播| 超碰男人的天堂| 欧美国内亚洲| 国产欧美日韩丝袜精品一区| 伦理片一区二区三区| 亚洲综合成人在线视频| 激情黄色小视频| 色棕色天天综合网| 欧美激情女人20p| 97国产精品久久久| 国产日韩影视精品| 精品国产免费av| 2020最新国产精品| 麻豆成人在线看| 中文字幕+乱码+中文| 91一区二区在线| 成人性生活视频免费看| 午夜电影一区| www国产精品视频| 波多野结衣黄色网址| wwww国产精品欧美| 成人午夜视频在线观看免费| 欧美日韩黄色| 久热国产精品视频| 91精品视频免费在线观看| 中文子幕无线码一区tr| 国产黄色特级片| 午夜精品福利影院| 97国产精品视频人人做人人爱| 国产高潮流白浆喷水视频| 最近中文字幕一区二区三区| 伊人色在线观看| 99精品电影| 91丝袜美腿美女视频网站| 黄色网在线播放| 91精品国产综合久久久久久久| 欧美做受高潮6| 日日骚欧美日韩| 欧美亚洲另类在线一区二区三区| 性国裸体高清亚洲| 亚洲欧美激情精品一区二区| 秋霞av一区二区三区| 久久久久久久久免费| 国产精品免费成人| 精品国产中文字幕第一页| 国产成人中文字幕| 大乳在线免费观看| 欧美日韩国产影片| 午夜精品久久久久99蜜桃最新版| 久久精品国产精品亚洲红杏| 91手机视频在线| 一本色道69色精品综合久久| 欧美国产日韩在线| 天堂av资源在线| 色综合久久久久久久| 亚洲精品91在线| 精品在线观看视频| 99久久免费观看| 色综合www| 国产精品高潮呻吟久久av黑人| 成年午夜在线| 日韩亚洲欧美成人一区| 国产无套粉嫩白浆内谢| 久久午夜色播影院免费高清 | 国产精品亚洲第一区在线暖暖韩国 | 又黄又爽又色的视频| 狠狠入ady亚洲精品| 免费久久久一本精品久久区| 日韩久久一区| 午夜精品一区二区三区在线 | 欧美伦理91i| 三级国产在线观看| 欧美日韩国产欧美日美国产精品| 久久久久久久久99| 久久久激情视频| 国内精品国产三级国产aⅴ久| 99精品欧美| 亚洲乱码一区二区三区| 成人看片黄a免费看视频| 青草青草久热精品视频在线网站| 95在线视频| 精品国产制服丝袜高跟| 无码人妻久久一区二区三区| 亚洲三级视频在线观看| 蜜臀av一区二区三区有限公司| 奇米影视7777精品一区二区| 国产精品三级一区二区| 国产一区二区观看| 91精品国产99久久久久久红楼| 成年美女黄网站色大片不卡| 美女精品视频一区| 日夜干在线视频| 欧美一级视频精品观看| 国产亚洲欧美在线精品| 夜夜精品浪潮av一区二区三区| 亚洲久久久久久久| 成人污视频在线观看| 在线免费观看视频黄| 夜久久久久久| 喜爱夜蒲2在线| 日韩久久精品| 欧美日韩精品免费在线观看视频| 国产aa精品| 国产精品久久不能| 中文在线免费视频| 韩国福利视频一区| 欧洲黄色一区| 久青草国产97香蕉在线视频| 91xxx在线观看| 亚洲视频在线观看视频| 手机在线精品视频| 日韩欧美一区二区不卡| 亚洲一区二区人妻| 在线国产电影不卡| 国产性生活视频| 欧美日韩在线视频一区| 国产一级淫片a| 亚洲一区免费观看| 欧美日韩亚洲国产另类| 亚洲人123区| 一级免费黄色录像| 国产精品久久看| 国产真实乱人偷精品人妻| 91麻豆精品在线观看| 国产精品一区二区人妻喷水| 国产91丝袜在线18| 国产女主播在线播放| 国产激情视频一区二区在线观看| 日韩av.com| 激情综合五月天| 久久久久xxxx| 韩国v欧美v日本v亚洲v| 不卡中文字幕在线观看| 国内一区二区视频| 亚洲AV无码久久精品国产一区| 极品美女销魂一区二区三区免费| 九九九九九国产| 国产中文字幕一区| 性感美女一区二区三区| 成人的网站免费观看| 香港三日本8a三级少妇三级99| 成人91在线观看| 噜噜噜在线视频| 久久久久久久性| 久久精品国产亚洲AV成人婷婷| 中文字幕电影一区| 色欲一区二区三区精品a片| 亚洲欧美福利一区二区| 久久久久久久久久久久久久久久久 | 国产精品99| 91精品久久久久久久久中文字幕| 自拍偷拍亚洲| 动漫美女被爆操久久久| 精品视频自拍| 欧美日韩一区二区三| 成人精品影院| a级片一区二区| 国产日韩专区| 亚洲免费av一区二区三区| 狠狠色狠狠色综合日日91app| 亚洲成人福利视频| 91网页版在线| 免费黄色国产视频| 亚洲自拍偷拍麻豆| 免费的毛片视频| 69久久99精品久久久久婷婷| 二区三区在线视频| 国产亚洲精品91在线| 黄色网址在线免费观看| 96精品视频在线| 日韩一区二区三区四区五区| 国产精品久久国产三级国电话系列 | 日韩国产欧美一区| 欧美成人69av| 男人透女人免费视频| 国产成人在线免费| 色哟哟精品观看| 亚洲一区二区在线免费看| 成人毛片一区二区三区| 日韩欧美一区二区在线视频| 欧美婷婷久久五月精品三区| 日韩有码在线电影| 欧美男人天堂| 国产欧美一区二区三区四区| 国产精品色呦| 中国成人亚色综合网站| 国产精品久久久亚洲一区| 亚洲午夜激情影院| 久久人人超碰精品| 精品少妇一二三区| 欧美日韩精品综合在线| 亚洲 欧美 精品| 美乳少妇欧美精品| 亚洲天堂1区| 精品在线一区| 中文字幕日韩欧美精品高清在线| 亚洲爆乳无码专区| 成人免费黄色大片| 黄色录像免费观看| 色婷婷av一区二区| 少妇喷水在线观看| 欧美成人午夜激情在线| 欧美日韩国产网站| 免费久久久一本精品久久区| 亚洲午夜极品| 精品人妻一区二区三| 国产精品美女www爽爽爽| 九九精品免费视频| 亚洲二区在线播放视频| а√天堂资源地址在线下载| 国产精品久久久久久久午夜| 五月天亚洲色图| 凹凸国产熟女精品视频| 成人免费观看男女羞羞视频| 欧美国产日韩在线观看成人| 欧美日韩一区国产| 丁香婷婷在线观看| 国产精品盗摄久久久| 国产成人ay| 久久精品视频91| 91美女福利视频| 亚洲欧美综合另类| 日韩禁在线播放| 精品极品在线| 精品一区日韩成人| 国产精品视频| 中文字幕一区二区人妻在线不卡| 图片区小说区国产精品视频| 人妻妺妺窝人体色www聚色窝 | 亚洲欧美精品suv| 永久免费毛片在线播放| 蜜桃狠狠色伊人亚洲综合网站| 亚洲免费一区二区| avtt香蕉久久| 精品国产91久久久久久老师| 天天综合网在线| 5252色成人免费视频| 亚洲色图丝袜| 黄色免费网址大全| 国产精品网站在线播放| 一级特黄aaaaaa大片| 插插插亚洲综合网| 6080成人| 蜜桃传媒一区二区三区| 97久久超碰精品国产| 中文字幕在线播| 在线精品国产成人综合| 中文成人在线| 丰满的少妇愉情hd高清果冻传媒| 99riav久久精品riav| 一级一片免费看| 久久久国产一区二区| 伊人www22综合色| 国产精品免费入口| 中文在线资源观看网站视频免费不卡 | 国产盗摄——sm在线视频| 蜜桃视频日韩| 美女视频黄久久| 欧美日韩大片在线观看| 亚洲激情在线观看| se01亚洲视频| 欧美精品久久96人妻无码| 国产91丝袜在线播放0| 精品免费囯产一区二区三区 | 久色婷婷小香蕉久久| 日韩视频中文字幕在线观看| 亚洲成人免费网站| 日韩电影av| 黑人巨茎大战欧美白妇| 久久综合九色综合97婷婷女人| 少妇又紧又色又爽又刺激视频 | 日韩欧美另类一区二区| 亚洲欧美丝袜| 99re66热这里只有精品3直播| 亚洲香蕉在线视频| 午夜欧美大片免费观看| 久久人体视频| 成人免费毛片日本片视频| 欧美日韩激情在线| 妞干网免费在线视频| 欧美日韩在线观看一区二区三区| 日韩专区欧美专区| 国产在线免费视频| 正在播放亚洲1区| 精品欧美午夜寂寞影院| 亚洲一区二区三区四区五区| 欧美日韩国产区| a天堂中文在线官网在线| 品久久久久久久久久96高清| 国产成a人亚洲| 日批视频免费观看| 国产69久久精品成人|