微信小程序因其双线程框架,导致大部分API都是异步API,比如,最常用的wx.request。而小程序的API的设计,都是采用回调形式。这样,业务过于复杂的时候,就会陷入回调地狱中,而且代码的可读性也变差。
提到异步编程,Promise就该闪亮登场了。
Promise
微信小程序有众多的API,总不能用到哪个,封装哪个,这样太繁琐了,还是得统一封装一下,复制一套微信小程序API,代理异步方法,封装成Promise。说道代理,Proxy要闪亮登场了,但是,微信小程序除了iOS10+以上的系统,其他环境并不支持Proxy,好吧,只能让Proxy歇歇了。老老实实的使用Object.defineProperty代理吧。
Object.defineProperty
function isObject (object) { return Object.prototype.toString.call(object) === '[object Object]' }
function copy (object, target) { let copyobject = target || {} const keys = Object.keys(object) keys.forEach(key => { if (isObject(object[key])) { copy(object[key], copyobject[key]) } else { copyobject[key] = object[key] } }) return copyobject }
function proxyProperty (object, property) { const value = object[property] Object.defineProperty(object, property, { get () { if (typeof value === 'function' && !/(Sync)$/.test(property)) { return function(params, ...args) { return new Promise((resolve, reject) => { value ({ ...params, success: res => { params && params.success && params.success(res); resolve(res); }, fail: err => { params && params.fail && params.fail(err); reject(err) } }, ...args); }); }.bind(object); } else { return value } } }) } function proxy (object) { const keys = Object.keys(object) keys.forEach(key => { if (isObject(object[key])) { proxy(object[key]) } else { proxyProperty(object, key) } }) } let wxapi = copy(wx) proxy(wxapi)
export { wxapi }
import { wxapi } from './utils/util.js'; App({ wxapi })
尽情的then,async/await吧。·