Skip to content

promise封装API

使用promise函数对小程序的原生API进行封装,搭配async、await将异步API转换为同步

问题

微信小程序的开发中虽然已经支持了ES6语法,但是在微信原生的API中还是ES5的回调函数, 在项目中使用不方便。

备注

基础库 2.10.2 版本起,异步 API 支持 callback & promise 两种调用方式。当接口参数 Object 对象中不包含 success/fail/complete 时将默认返回 promise,否则仍按回调方式执行,无返回值。

但downloadFile, request, uploadFile, connectSocket, createCamera这些方法不支持promise

解决

util.js

js
export const promisic = function (func) {
  return function (params = {}) {
    return new Promise((resolve, reject) => {
      const args = Object.assign(params, {
        success: (res) => {
          resolve(res)
        },
        fail: (error) => {
          reject(error)
        }
      })
      func(args)
    })
  }
}

解析:

promisic函数的核心是对方法进行promise封装,方法执行完后,返回promise函数

参数传递使用柯里化思想

需要传入的参数有俩个:执行的方法名称和方法调用时需要的参数

http.js

使用promisic封装request方法

js
import { config } from "../config/config";
import { promisic } from "./util";

export default class Http {
  static async request({
                   url,
                   data,
                   method = 'GET'
  }) {
    const res = await promisic(wx.request)({
      url: `${config.apiBaseUrl}${url}`,
      data,
      method,
      header: {
        appkey: config.appKey
      }
    })
    return res.data
  }
}

备注

上面只是封装的wx.request,如果想封装其他方法,可以传其他方法名称

使用

banner.js

js
import Http from "../utils/http";

export default class Banner {
  static locationB = 'b-1'

  static async getHomeLocationB() {
    return await Http.request({
      url: `banner/name/${Banner.locationB}`
    })
  }
}

home.js

js
const bannerB = await Banner.getHomeLocationB()

备注

promisic既可以封装微信小程序原生API,也可以封装uniapp里的API

如有转载或 CV 的请标注本站原文地址