上回寫到:小程序
沒看上回的同窗,在這裏: 在微信小程序中使用 async/await
// utils/async.js function wxPromisify(fn) { return async function(args) { return new Promise((resolve, reject) => { fn({ ...(args || {}), success: res => resolve(res), fail: err => reject(err) }); }); }; } export function toAsync(names) { return (names || []) .map(name => ( { name, member: wx[name] } )) .filter(t => typeof t.member === "function") .reduce((r, t) => { r[t.name] = wxPromisify(wx[t.name]); return r; }, {}); }
// pages/somepage/somepage.js import { toAsync } = require("../../utils/async"); // ... const awx = toAsync(["login", "request"]); await awx.login(); await awx.request({...});
這不已經封裝過了嗎?segmentfault
這回寫的是不同的封裝。由於,一個小程序裏要寫好多個 toAsync
調用,真的很煩吶!微信小程序
能不能一次封裝,處處調用?能!把全部用到的方法都在初始化的時候封裝起來。但是,不免會有遺漏。微信
能不能一次封裝,處處調用,還不須要初始化?網絡
能!祭出 Proxy 大神:app
// utils/asyncjs function wxPromisify(fn) { ... } // 前面已經定義過了 export function asyncProxy(target) { return new Proxy(target, { cache: {}, get(it, prop) { const aFn = this.cache[prop]; if (aFn) { return aFn; } const v = it[prop]; if (typeof v !== "function") { return v; } return this.cache[prop] = wxPromisify(v); } }); }
// app.js import { asyncProxy } from "./utils/async"; App({ onLaunch: function() { wx.awx = asyncProxy(wx); // .... } })
// pages/somepage/somepage // ... const { awx } = wx; await awx.login(); await awx.request({...});
解釋:async
由於 awx
是代理的 wx
對象,調用 awx.login()
的時候,實際是先調用代理的 get(wx, "login")
,找到用來代替 wx.login
的東西。函數
根據上面代碼裏的邏輯,先從 cache
裏找使用 wxPromisify()
封裝的結果,如有,直接返回;若沒有,先封裝成 Promise 網絡的函數,存入 cache
,再返回。ui
直觀一點描述,大概是這樣:this
awx.login(); ^^^^^^ get(wx, "login")
請關注公衆號邊城客棧⇗
看完了先別走,點個贊啊 ⇓,讚揚 ⇘ 也行!