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

在微信小程序中使用async/await

開發 前端
微信小程序中有大量接口是異步調用,比如 wx.login()、wx.request()、wx.getUserInfo() 等,都是使用一個對象作為參數,并定義了 success()、fail() 和 complete() 作為異步調用不同情況下的回調。

微信小程序中有大量接口是異步調用,比如 wx.login()、wx.request()、wx.getUserInfo() 等,都是使用一個對象作為參數,并定義了 success()、fail() 和 complete() 作為異步調用不同情況下的回調。

但是,以回調的方式來寫程序,真的很傷,如果有一個過程需要依次干這些事情:

  •  wx.getStorage() 獲取緩存數據,檢查登錄狀態
  •  wx.getSetting() 獲取配置信息,
  •  wx.login() 使用配置信息進行登錄
  •  wx.getUserInfo() 登錄后獲取用戶信息
  •  wx.request() 向業務服務器發起數據請求
  •  ……

那么,代碼大概會長這樣 

  1. wx.getStorage({  
  2.     fail: () => {  
  3.         wx.getSetting({  
  4.             success: settings => {  
  5.                 wx.login({  
  6.                     success: ({ code }) => {  
  7.                         wx.getUesrInfo({  
  8.                             code,  
  9.                             success: (userInfo) => {  
  10.                                 wx.request({  
  11.                                     success: () => {  
  12.                                         // do something  
  13.                                     }  
  14.                                 });  
  15.                             }  
  16.                         });  
  17.                     }  
  18.                 });  
  19.             }  
  20.         });  
  21.     }  
  22. }); 

顯然,async/await 可以同樣邏輯的代碼看起來舒服得多。不過默認情況下,“微信開發者工具”并不支持 async/await。如何啟用?

1. 用上 async/await

如果有心,在微信小程序官方文檔中搜索 async 可以找到“工具⇒開發輔助⇒代碼編譯”頁面中提到了對 async/await 的支持情況,是在“增加編譯”小節的一個表格中,摘錄一段:

在 1.02.1904282 以及之后版本的開發工具中,增加了增強編譯的選項來增強 ES6 轉 ES5 的能力,啟用后會使用新的編譯邏輯以及提供額外的選項供開發者使用。    

特性 原有邏輯 增強編譯
Async/Await 不支持 支持
  •   支持 async/await 語法,按需注入 regeneratorRuntime,目錄位置與輔助函數一致

總之呢,就是,只要把“微信開發者工具”更新到 v1.02.1904282 以上,就不需要干 npm install regenerator 這之類的事情,只需要修改一個配置項就能使用 async/await 特性了。這個配置就在“工具欄⇒詳情⇒本地設置”頁面中。

為了快速驗證 async/await 可用,在 app.js 的 onLaunch() 事件函數中加一段代碼: 

  1. (async () => {  
  2.     const p = await new Promise(resolve => {  
  3.         setTimeout(() => resolve("hello async/await"), 1000);  
  4.     });  
  5.     console.log(p);  
  6. })(); 

在短暫的自動編譯運行之后,在調試器界面的 Console 頁簽中可以看到輸出: 

  1. hello async/await 

如果不行,請先檢查“微信開發者工具”的版本——至少,去下載一個最新版本總不會有問題的。

2. 改造 wx.abcd 異步方法

雖然 async/await 得到了支持,但是還得把 wx.abcd() 封裝成 Promise 風格才行。

Node.js 在 util 模塊中提供了 promisify 來把 Node.js 風格的回調轉換成 Promise 風格,但顯然它不適用于 wx 風格。還是自己動手吧,也不用考慮太多,比如 wx 風格的異步調用在形式上都是一致的,它們的特征如下 :

  •  使用一個對象傳遞所有參數,包括三個主要的回調
  •  success: (res) => any 在異步方法成功時回調
  •  fail: (err) => any 在異步方法失敗時回調
  •  complete: () => any 在異步方法完成(不管成功還是失敗)時回調

所以,如果 wx.abcd() 改成了 Promise 風格,通過 async/await 來編寫,大概應該是這個樣子 

  1. try {  
  2.     const res = wx.abcd();  
  3.     // do anything in success callback  
  4. } catch (err) {  
  5.     // do anything in fail callback  
  6. } finally {  
  7.     // do anything in complete callback  

當然,catch 和 finally 這兩個部分并不是必須,也就是說,不一定非得用 try 語句塊。但是,如果不用 catch,會有一個神坑存在,這個問題后面再說。現在首先要做的是改造。

2.1. 定義 promisify()

promisify() 就是一個封裝函數,傳入原來的 wx.abcd 作為參加,返回一個 Promise 風格的新函數。代碼和解釋如下: 

  1. function promisify(fn) {  
  2.     // promisify() 返回的是一個函數,  
  3.     // 這個函數跟傳入的 fn(即 wx.abcd) 簽名相同(或兼容)  
  4.     return async function(args) {  
  5.     //                    ^^^^ 接受一個單一參數對象  
  6.         return new Promise((resolve, reject) => {  
  7.     //             ^^^^^^^^^^^ 返回一個 Promise 對象  
  8.             fn({  
  9.     //      ^^ ^ 調用原函數并使用改造過的新的參數對象  
  10.                 ...(args || {}),  
  11.     //          ^^^^^^^^        這個新參數對象得有原本傳入的參數,  
  12.     //                      ^^  當然得兼容沒有傳入參數的情況  
  13.                 success: res => resolve(res),  
  14.     //          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^  注入 success 回調,resovle 它  
  15.                 fail: err => reject(err)  
  16.     //          ^^^^^^^^^^^^^^^^^^^^^^^^ 注入 fail 回調,reject 它 
  17.             });  
  18.         });  
  19.     };  

舉例使用它: 

  1. const asyncLogin = promisify(wx.login);  // 注意別寫成 wx.login(),為什么,我不說  
  2. try {  
  3.     const res = asyncLogin();  
  4.     const code = res.code;  
  5.     // do something with code  
  6. } catch (err) {  
  7.     // login error  
  8. } finally {  
  9.     // promisify 里沒有專門注入 complete 回調,  
  10.     // 因為 complete 的內容可以寫在這里  

2.2. 定義 wx.async()

不過老實說,把要用的異步方法通過 promisify 一個個處理,寫起來還是挺煩的,不如寫個工具函數把要用的方法一次性轉換出來。不過一查,wx 下定義了不知道多少異步方法,還是退而求其次,用到啥轉啥,不過可以批量轉,轉出來的結果還是封裝在一個對象中。整個過程就是迭代處理,最后把每個處理結果聚焦在一起: 

  1. function toAsync(names) {    // 這里 names 期望是一個數組  
  2.     return (names || [])  
  3.         .map(name => (  
  4.             {  
  5.                 name,  
  6.                 member: wx[name]  
  7.             }  
  8.         ))  
  9.         .filter(t => typeof t.member === "function")  
  10.         .reduce((r, t) => {  
  11.             r[t.name] = promisify(wx[t.name]);  
  12.             return r;  
  13.         }, {});  

這個 toAsync 的用法大致是這樣的 

  1. const awx = toAsync(["login", "request"]);  
  2. await awx.login();  
  3. await awx.request({...}); 

有些人可能更習慣單個參數傳入的方式,像這樣 

  1. const awx = toAsync("login", "request"); 

那么在 toAsync 的定義中,參數改為 ...names 就好,即 

  1. function toAsync(...names) { ... } 

還沒完,因為我不想在每一個 JS 文件中去 import { toAsync } from ...。所以把它在 App.onLaunch() 中把它注入到 wx 對象中去,就像這樣 

  1. App({  
  2.     onLaunch: function() {  
  3.         // ...  
  4.         wx.async = toAsync 
  5.         // ...  
  6.     }  
  7. }); 

3. await 帶來的神坑

工具準備好了,代碼也大刀闊斧地進行了改造,看起來舒服多了,一運行卻報錯!為什么???

先來看一段原來的代碼,是這樣的 

  1. wx.getStorage({  
  2.     key: "blabla",  
  3.     success: res => {  
  4.         // do with res  
  5.     }  
  6. }); 

改造之后是這樣 

  1. const res = await awx.getStorage({ key: "blabla" });  // <== runtime error  
  2. // do with res 

awx.getStorage 拋了個異常,原因是叫 "blabal" 的這個數據不存在。

為什么原來沒有錯,現在卻報錯?

因為原來沒有定義 fail 回調,所以錯誤被忽略了。但是 promisify() 把 fail 回調封裝成了 reject(),所以 awx.getStorage() 返回的 Promise 對象上,需要通過 catch() 來處理。我們沒有直接使用 Promise 對象,而是用的 await 語法,所以 reject() 會以拋出異常的形式體現出來。

用人話說,代碼得這樣改: 

  1. try {  
  2.     const res = await awx.getStorage({ key: "blabla" });  // <== runtime error  
  3.     // do with res  
  4. } catch (err) {  
  5.     // 我知道有錯,就是當它不存在!  

傷心了不是?如果沒有傷心,你想想,每一個調用都要用 try ... catch ... 代碼塊,還能不傷心嗎?

3.1. 忽略不需要處理的錯誤

處理錯誤真的是個好習慣,但真的不是所有錯誤情況都需要處理。其實要忽略錯誤也很簡單,直接在每個 Promise 形式的異步調后面加句話就行,比如 

  1. const res = await awx  
  2.     .getStorage({ key: "blabla" })  
  3.     .catch(() => {});  
  4. //  ^^^^^^^^^^^^^^^^ 捕捉錯誤,但什么也不干 

稍微解釋一下,在這里 awx.getStorage() 返回一個 Promise 對象,對該對象調用 .catch() 會封裝 reject 的情況,同時它會返回一個新的 Promise 對象,這個對象才是 await 等待的 Promise。

不過感覺 .catch(() => {}) 寫起來怪怪的,那就封裝成一個方法吧,這得改 Promise 類的原形 

  1. Promise.prototype.ignoreError = function() {  
  2.     return this.catch(() => { });  
  3. }; 

這段代碼放在定義 toAsync() 之前就好。

用起來也像那么回事 

  1. const res = await awx  
  2.     .getStorage({ key: "blabla" })  
  3.     .ignoreError(); 

對于單個 await 異步調用,如果不想寫 try ... catch ... 塊,還可以自己定義一個 ifError(fn) 來處理錯誤的情況。但是如果需要批量處理錯誤,還是 try ... catch ... 用起順手:

4. 回到開始 

  1. try {  
  2.     const storeValue = await awx.getStorage({});  
  3.     const settings = await awx.getSetting();  
  4.     const { code } = await awx.login();  
  5.     const userInfo = await awx.getUserInfo({ code });  
  6. } catch (err) {  
  7.     // 處理錯誤吧  

看,不需要對每個異步調用定義 fail 回調,一個 try ... catch ... 處理所有可能產生的錯誤,這可不也是 async/await 的優勢! 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2017-10-26 13:40:26

微信小程序Fly

2012-07-22 15:59:42

Silverlight

2017-05-08 15:03:07

微信小程序開發實戰

2022-06-16 10:37:09

asyncawait

2016-10-20 21:02:12

微信小程序javascript

2017-01-09 10:01:49

微信小程序

2017-06-09 10:40:00

微信小程序架構分析

2016-09-28 18:10:59

微信程序MINA

2017-06-09 12:58:20

微信小程序架構分析

2016-11-04 10:31:49

微信程序指南

2017-06-09 10:06:54

微信小程序架構分析

2016-11-22 11:23:52

微信小程序騰訊微信

2016-09-27 15:40:58

微信程序前端

2016-11-04 10:49:48

微信小程序

2021-06-10 10:51:27

程序基礎架構

2016-09-27 16:38:24

JavaScript微信Web

2016-11-19 18:06:44

微信小程序張小龍

2017-01-09 09:51:08

微信小程序

2021-03-05 06:25:19

fiddler微信公眾號小程序

2014-07-15 10:31:07

asyncawait
點贊
收藏

51CTO技術棧公眾號

日本亚洲欧洲色| 91精品国模一区二区三区| 精品麻豆av| 乱子伦一区二区三区| 在线国产一区二区| 国产丝袜一区视频在线观看 | 男人资源在线播放| 成人免费视频一区| 国产精品啪视频| 日韩激情在线播放| 91av精品| 国产一区二区三区欧美| 美女扒开腿免费视频| 亚洲天堂五月天| 青青久草在线| 国产精品一级在线| 国产精品福利在线观看| 国产精彩视频在线| 999成人网| 亚洲午夜小视频| 免费观看污网站| jizzyou欧美16| 欧美性猛交xxxx免费看漫画| 黄色影视在线观看| 国产视频网址在线| 久久综合网色—综合色88| 成人三级视频在线观看一区二区| 中文字幕在线2018| 久热国产精品| 91精品国产免费久久久久久 | 欧美特级www| 男人添女荫道口女人有什么感觉| 免费黄色网页在线观看| 欧美国产综合一区二区| 欧美尤物一区| 久草在现在线| 久久欧美中文字幕| 亚洲三级电影全部在线观看高清| 97超级碰碰碰久久久| 人妻人人澡人人添人人爽| 成人久久电影| 亚洲人成自拍网站| 久久久久久九九九九九| 久久精品凹凸全集| 欧美精品一区二区三区很污很色的| www.欧美激情.com| japansex久久高清精品| 欧美日韩成人综合| 五月天av在线播放| 深夜福利亚洲| 9191国产精品| 污视频在线观看免费网站| 四虎影视国产精品| 制服.丝袜.亚洲.中文.综合| 在线免费看v片| 免费观看亚洲天堂| 日韩三级视频中文字幕| 97免费公开视频| 伊人久久噜噜噜躁狠狠躁| 欧美一区二区不卡视频| 亚洲成人av免费观看| 午夜电影一区| 亚洲精品电影在线| 欧美 日本 国产| 国产成人黄色| 日韩一区二区三区在线播放| 日本一级特级毛片视频| 欧美一级高潮片| 日韩精品亚洲人成在线观看| 亚洲精品视频在线| 日韩精品在线看片z| 97av自拍| 天天爱天天干天天操| 91麻豆精东视频| 欧洲一区二区在线| 黄网站在线播放| 亚洲国产精品自拍| 成人羞羞国产免费网站| 国产麻豆一区| 精品美女一区二区三区| 大黑人交xxx极品hd| 成人在线免费观看91| 麻豆国产va免费精品高清在线| 久久精品99国产精| 久久aⅴ乱码一区二区三区| 国产精品视频在线观看| www.我爱av| 久久亚洲捆绑美女| 亚洲欧美日韩另类精品一区二区三区 | 中文字幕精品在线播放 | 久久99久久99精品中文字幕| 国产一级在线观看视频| 久久综合九色| 99爱精品视频| 1024国产在线| 亚洲成年人网站在线观看| 亚洲免费av一区二区三区| 精品一区二区三区中文字幕| 日韩av一卡二卡| 亚洲视频重口味| 亚洲欧美日韩国产一区二区| 国产日韩中文在线| 亚洲av片在线观看| 亚洲欧美日韩电影| av无码精品一区二区三区| 精品亚洲a∨一区二区三区18| 亚洲精品影视在线观看| 黄色一级视频免费| 日韩一级片中文字幕| 三区四区不卡| 69av在线视频| 国产乱淫a∨片免费观看| 99久久精品99国产精品| 丰满人妻一区二区三区53号| 91看片一区| 日韩精品黄色网| 粉嫩av性色av蜜臀av网站| 亚洲人成久久| 99在线视频播放| 91精彩在线视频| 色系网站成人免费| 私密视频在线观看| 中文字幕一区二区三三| 国产精品视频99| 免费黄色在线视频网站| 亚洲大片在线观看| 亚洲最大视频网| 亚洲精品888| 国产精品香蕉国产| 成人动漫在线免费观看| 欧美性猛交xxxx| 久久久久久久无码| 亚洲区国产区| 国产精品9999久久久久仙踪林| 黄色网址视频在线观看| 精品视频一区二区三区免费| 国产三级av在线播放| 亚洲欧美视频| 久久亚洲高清| 亚洲一二三四| 日韩av有码在线| 粉嫩aⅴ一区二区三区| 成人三级伦理片| 日本一本中文字幕| 卡一精品卡二卡三网站乱码| 久久久久久久久久国产| 三级网站在线看| 亚洲成人激情自拍| 国产xxxx视频| 亚洲一卡久久| 欧美日韩中文国产一区发布| 色8久久影院午夜场| 国产午夜精品免费一区二区三区| 亚洲免费在线视频观看| 久久久久久久久久久久久女国产乱| 国产亚洲欧美在线视频| 蜜乳av综合| 国产精品第8页| 欧美三级黄网| 欧美一级日韩一级| 日本精品一区二区三区视频| 人妻久久一区二区| 国产综合色精品一区二区三区| 伊人婷婷久久| 亚洲一区二区电影| 97av在线视频| av资源在线观看免费高清| 欧美另类videos死尸| 欧美精品99久久久| 99久久久久免费精品国产| 无码人妻丰满熟妇区96| 国产日韩欧美一区二区三区| 国产深夜精品福利| 伊人福利在线| 国产视频综合在线| 亚洲视频一区在线播放| 亚洲激情自拍视频| 中文字幕在线观看的网站| 日韩中文字幕av电影| 亚洲一区三区视频在线观看| 日韩av综合| 欧美孕妇与黑人孕交| 99re在线视频| 日韩欧美黄色影院| 婷婷激情五月网| 国产精品高潮呻吟| 91精品又粗又猛又爽| 日韩av一级片| 4444在线观看| 免费一区二区三区视频导航| 成人免费网站在线看| 成人ssswww在线播放| 在线观看免费高清视频97| 精品区在线观看| 色婷婷精品大视频在线蜜桃视频| 艳妇荡乳欲伦69影片| 99精品视频一区二区三区| 蜜臀一区二区三区精品免费视频| 好吊日精品视频| 婷婷久久五月天| 91综合久久爱com| 国产精品免费一区二区三区都可以| 日本一本在线免费福利| 亚洲视频专区在线| 亚洲卡一卡二卡三| 欧美日韩亚洲国产综合| 日韩精品久久久久久久酒店| 国产精品久线观看视频| 国产毛片毛片毛片毛片毛片毛片| 久久99精品久久久| 波多野结衣家庭教师视频| 综合久久亚洲| 亚洲图片欧洲图片日韩av| 欧美jizz19性欧美| www.久久久| 欧美特黄色片| 中文字幕精品一区二区三区精品| 国产一区二区视频在线免费观看| 国产a亚洲精品| 欧美自拍大量在线观看| 免费在线国产视频| 精品国内亚洲在观看18黄| 国际av在线| 精品一区二区三区三区| 天堂国产一区二区三区| 日韩久久久久久| 国产精品国产一区二区三区四区| 日本韩国精品一区二区在线观看| 粉嫩aⅴ一区二区三区| 亚洲国产日日夜夜| 男女免费视频网站| 亚洲欧美日韩系列| 欧美一级特黄高清视频| 国产精品人妖ts系列视频| 永久免费看mv网站入口78| 99国产精品99久久久久久| 一级黄色片毛片| 福利一区在线观看| 欧美激情一区二区三区p站| 国产精品一区二区三区网站| 91亚洲一区二区| 国产中文字幕精品| 欧美xxxxxbbbbb| 极品美女销魂一区二区三区免费| 手机在线免费观看毛片| 日韩av中文字幕一区二区三区| www黄色av| 久久免费黄色| 91淫黄看大片| 麻豆精品视频在线| 久久人人爽av| 国产盗摄女厕一区二区三区| 久久aaaa片一区二区| 成人一区二区在线观看| v天堂中文在线| 久久精品欧美一区二区三区不卡| 野外性满足hd| 国产日韩欧美综合一区| 黄色激情小视频| 亚洲婷婷在线视频| 18岁成人毛片| 午夜欧美视频在线观看| 黄色一级片免费看| 欧日韩精品视频| 国产婷婷一区二区三区久久| 日韩欧美精品在线| 天堂中文资源在线| 在线丨暗呦小u女国产精品| 久久精品视频免费看| 久久男人av资源网站| 欧美成人黑人| 成人欧美在线视频| 欧美在线导航| 亚洲午夜精品一区二区三区| 亚洲一区二区三区无吗| 国产精品12345| 免费亚洲电影在线| 国产人妻精品午夜福利免费| 黄色网页在线播放| 亚洲成av人影院在线观看| 色综合久久网女同蕾丝边| 中文字幕亚洲二区| av手机在线观看| 国产成人精彩在线视频九色| 日日夜夜综合| 国产综合18久久久久久| 精品国产一区二区三区久久久蜜臀 | 欧美精品尤物在线| 91欧美大片| 国产视频一视频二| 精品一区精品二区高清| 国产白嫩美女无套久久| 国产精品麻豆视频| 欧美成人精品欧美一| 日本道色综合久久| 好男人www在线视频| 亚洲最新中文字幕| 国产第一页在线| 国产欧美在线视频| 日本亚洲不卡| 精品嫩模一区二区三区| 视频在线观看国产精品| www.黄色网| 亚洲欧美日韩国产手机在线| 亚洲综合久久网| 日韩精品一区二区三区swag| 在线免费观看黄| 欧美一级免费视频| 亚洲精品一二三**| 亚洲成人蜜桃| 欧美一级专区| 91人人澡人人爽| 亚洲欧美一区二区久久| 国产情侣免费视频| 亚洲精品视频中文字幕| 三级资源在线| 国产日韩欧美黄色| 精品国产1区| 欧美日韩成人免费视频| 国产福利视频一区二区三区| 99精品全国免费观看| 欧美日韩视频在线| 免费的黄色av| 久久99热精品这里久久精品| 日本久久久久| 一区二区成人国产精品| 日韩综合一区二区| 亚洲综合网在线观看| 精品二区三区线观看| 欧洲av在线播放| 久久久久久网站| 1204国产成人精品视频| av在线com| 丁香天五香天堂综合| 懂色av懂色av粉嫩av| 欧美人与禽zozo性伦| 91啦中文在线| 国产精品丝袜白浆摸在线| 成人嘿咻视频免费看| 黑森林福利视频导航| 国产亚洲一区二区三区四区| 特黄视频免费看| 精品偷拍各种wc美女嘘嘘| 黄色18在线观看| 久99久在线| www日本视频| 日韩精品中文字幕一区二区三区| 国产在线观看91| 91色视频在线导航| 888久久久| 成人欧美精品一区二区| 亚洲国产欧美日韩另类综合 | 综合网在线观看| 亚洲欧洲高清在线| 九九九伊在线综合永久| 中文字幕久久一区| 国产成人精品午夜视频免费| 国产精品不卡av| 亚洲男人的天堂在线播放| 暖暖成人免费视频| 亚洲欧美日韩精品久久久| 韩国欧美国产1区| 九九视频在线观看| 精品国产一区a| 成人片免费看| 亚洲国产精品视频一区| 国产精品综合在线视频| 国产性xxxx高清| 一区二区中文字幕| 国产一区二区三区亚洲综合| 国产成人艳妇aa视频在线| 26uuu色噜噜精品一区二区| 91在线视频免费播放| www.日韩免费| 国语一区二区三区| 美女网站免费观看视频| 亚洲精品乱码久久久久久久久| 日本免费不卡视频| 国产成人精品a视频一区www| 国产电影一区二区在线观看| 亚洲婷婷在线观看| 色狠狠色噜噜噜综合网| av在线影院| 欧美国产二区| 国产一区二区三区久久悠悠色av| 久久中文字幕在线观看| 亚洲午夜女主播在线直播| 国产精品xnxxcom| 男女高潮又爽又黄又无遮挡| 国产欧美日韩三级| 亚洲精品一区二区三区蜜桃 | 一区二区三区免费观看视频| 久久乐国产精品| 日韩电影免费网站| 黄色免费视频网站| 欧美日韩成人综合| xx欧美视频| 久久av综合网| 中文字幕一区二区三区蜜月| 欧美一级淫片aaaaaa|