国语自产少妇精品视频蜜桃,国产日韩欧美视频网址,女人摸下面自熨视频在线播放,婷婷色香合缴缴情av第三区

增強微信小程序API,遠離回調(diào)地獄

發(fā)布日期:2020-09-05  瀏覽:2459 

 增強微信小程序API,遠離回調(diào)地獄

增強微信小程序API

為什么要增強微信小程序API

微信小程序因其雙線程框架,導致大部分API都是異步API,比如,最常用的wx.request。而小程序的API的設計,都是采用回調(diào)形式。這樣,業(yè)務過于復雜的時候,就會陷入回調(diào)地獄中,而且代碼的可讀性也變差。

材料準備

提到異步編程,Promise就該閃亮登場了。

Promise

微信小程序有眾多的API,總不能用到哪個,封裝哪個,這樣太繁瑣了,還是得統(tǒng)一封裝一下,復制一套微信小程序API,代理異步方法,封裝成Promise。說道代理,Proxy要閃亮登場了,但是,微信小程序除了iOS10+以上的系統(tǒng),其他環(huán)境并不支持Proxy,好吧,只能讓Proxy歇歇了。老老實實的使用Object.defineProperty代理吧。

Object.defineProperty

擼代碼環(huán)節(jié)

工具函數(shù)走起

判斷是否為對象

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)

導出增強API

export {

  wxapi

}

app.js中導入掛載

import { wxapi } from './utils/util.js';

App({

  wxapi

})

END

盡情的then,async/await吧。·