微信小程序 API promisify 及後端接口統一管理 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

微信小程序 API promisify 及後端接口統一管理

發表時(shí)間:2021-1-4

發布人(rén):融晨科技

浏覽次數:95

API promisify

微信小程序幾乎所有的(de) API 都是(shì)采用回調的(de)形式,很容易陷入“回調地(dì / de)獄”,完全享受不(bù)到(dào)“現代化”的(de)異步編程 Promise、async/await 所帶來(lái)的(de)優勢。

我們可以(yǐ)對微信小程序的(de) API Promise 化。

// 封裝
export const getImageInfo = (src) => {
  return new Promise((success, fail) => wx.getImageInfo({ src, success, fail }))
}

// 使用
const getBg = getImageInfo(bgUrl)
const getAvatar = getImageInfo(avatarUrl)
Promise.all([getBg, getAvatar]).then(([bg, avatar]) => {
  // ...
})
複制代碼

進一步的(de),我們可以(yǐ)将一些常用的(de) API 進行封裝:

// utils/promisify.js

/**
 * 獲取圖片信息,網絡圖片需先配置 download 域名才能生效。
 * @param {String} src 
 */
export const getImageInfo = (src) => {
  return new Promise((success, fail) => wx.getImageInfo({ src, success, fail }))
}

/**
 * 保存圖片到(dào)系統相冊
 * @param {Object} options 
 */
export const saveImageToPhotosAlbum = (options) => {
  return new Promise((success, fail) => wx.saveImageToPhotosAlbum({ ...options, success, fail }))
}

// ...
複制代碼

miniprogram-api-promise

在(zài)生産中,推薦直接使用 npm 包 miniprogram-api-promise,其原理也(yě)是(shì)使用 Promise 對 API 進行了(le/liǎo)一次封裝:

源碼見 node_modules/miniprogram-api-promise/src/promise.js

npm install --save miniprogram-api-promise
複制代碼
import { promisifyAll, promisify } from 'miniprogram-api-promise';

// promisify all wx's api
const wxp = {}
promisifyAll(wx, wxp)
console.log(wxp.getSystemInfoSync())
wxp.getSystemInfo().then(console.log)
wxp.showModal().then(wxp.openSetting())

// compatible usage
wxp.getSystemInfo({success(res) {console.log(res)}})

// promisify single api
promisify(wx.getSystemInfo)().then(console.log)
複制代碼

wx.request 封裝

wx.request 是(shì)微信小程序最常用的(de) API 之(zhī)一,請求的(de)參數較多,請求結束後的(de)操作又是(shì)通過回調函數來(lái)完成的(de),多有不(bù)便。

下面對該 API 進行封裝,使其支持 Promise:

// utils/request.js

/**
 * promisify wx.request
 * @param {String} baseURL 域名
 * @param {String} url 請求路徑
 * @param {Object} data 請求參數
 * @param {String} method 請求方法
 */
class Request {
  constructor(params) {
    this.withBaseURL = params.withBaseURL
    this.baseURL = params.baseURL
  }

  get(url, data) {
    return this.request('GET', url, data)
  }

  post(url, data) {
    return this.request('POST', url, data)
  }

  request(method, url, data) {
    return new Promise((resolve, reject) => {
      wx.request({
        method,
        data,
        url: this.withBaseURL ? this.baseURL + url : url,
        header: getApp().globalData.getHeader(),
        success: (res) => resolve(res),
        fail: (err) => reject(err),
      })
    })
  }
}

export default new Request({
  withBaseURL: true,
  baseURL: getApp().globalData.host,
})
複制代碼

後端接口統一管理

爲(wéi / wèi)了(le/liǎo)便于(yú)管理,我們往往會将項目中使用到(dào)的(de) HTTP 請求放到(dào)一起進行維護:

// apis/user.js
import request from '../utils/request'

export const addUser = (data) => request.post('/user/add', data)
export const getUserList = (data) => request.get('/user/list', data)
export const getUserInfo = (data) => request.get('/user/info', data)
複制代碼
// apis/product.js
import request from '../utils/request'

export const addProduct = (data) => request.post('/product/add', data)
export const getProductList = (data) => request.get('/product/list', data)
export const getProductDetail = (data) => request.get('/product/detail', data)

相關案例查看更多