微信小程序mpvue入坑(3)之Promise封装wx.request及整合Api----新增源码地址

1、在src下utils新建一个promiseRequest.js文件(用es6-promise封装wx.request)代码如下:

import store from '@/store'
import { Toast } from './index'
import { Constant } from './settingConfig'
const Promise = require('es6-promise').Promise

function wxPromisify (fn) {
  return function (obj = {}) {
    return new Promise((resolve, reject) => {
      // 成功 (只返回res.data)
      obj.success = function (res) {
        这里可以做全局拦截
        if (res.data.success) {
          resolve(res.data)
        } else {
          Toast(res.data.msg || res.data.message, 'none', 1600)
        }
      }
      obj.fail = function (res) {
        // console.log('失败拦截', res)
        reject(res)
      }
      fn(obj)
    })
  }
}
// post请求
function wxCompletePromisify (fn) {
  return function (obj = {}) {
    return new Promise((resolve, reject) => {
      obj.success = function (res) {
        // 成功 (只返回res.data)
        resolve(res)
      }
      obj.fail = function (res) {
        // 失败
        reject(res)
      }
      fn(obj)
    })
  }
}
// 无论promise对象最后状态如何都会执行
Promise.prototype.finally = function (callback) {
  let P = this.constructor
  return this.then(
    value => P.resolve(callback()).then(() => value),
    reason => P.resolve(callback()).then(() => {
      throw reason
    })
  )
}
/**
 * 微信请求get方法
 * url
 * data 以对象的格式传入
 */
export function getRequest (url, data) {
  var getRequest = wxPromisify(wx.request)
  var header = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'x-requested-with': 'XMLHttpRequest'
  }
  if (url !== Constant.BASE_URL + '/scm/app/checkUser' && url !== Constant.BASE_URL + '/scm/app/getOpenId') {
    header.Authorization = store.getters.token
  }
  return getRequest({
    url: url,
    method: 'GET',
    data: data,
    header: header
  })
}

/**
 * 微信请求post方法封装
 * url
 * data 以对象的格式传入
 */
export function postRequest (url, data) {
  var postRequest = wxPromisify(wx.request)
  var header = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'x-requested-with': 'XMLHttpRequest'
  }
  if (url !== Constant.BASE_URL + '/scm/app/registerDriver' && url !== Constant.BASE_URL + '/scm/app/registerSupplier') {
    header.Authorization = store.getters.token
  } else {
    postRequest = wxCompletePromisify(wx.request)
  }
  return postRequest({
    url: url,
    method: 'POST',
    data: data,
    header: header
  })
}

2、在src下新建一个api文件夹——存所有请求接口(方便后续统一管理)

新建index.js文件(配置wx.request的config——格式化参数)代码如下

import { getRequest, postRequest } from '@/utils/promiseRequest'
import { Constant } from '@/utils/settingConfig'

export default (function request () {
  return function () {
    let args = Array.from(arguments)
    const config = args[0]
    const funcName = args[1]
    const data = args[2]
    if (typeof config[funcName] !== 'object') {
      throw new Error('调用api函数函数错误,请检查函数名称是否错误')
    }
    // 配置wx.request的config
    var newConfig = JSON.parse(JSON.stringify(config[funcName]))

    if (newConfig.method === 'post') {
      return postRequest(Constant.BASE_URL + newConfig.url, data)
    } else {
      return getRequest(Constant.BASE_URL + newConfig.url, data)
    }
  }
})()

新建apiPath文件(放置所有请求接口)代码如下

import request from '../index'

const config = {
  /**
   * 注册登录api
   */
  // 获取当前登录人信息
  getProfile: {
    url: '/dx-user/system/user/profile'
  },
  // 根据小程序openId校验用户是否已经绑定
  checkUser: {
    url: '/scm/app/checkUser'
  },
  // 根据code获取openId
  getOpenId: {
    url: '/scm/app/getOpenId',
    method: 'post'
  },
.....
}
export default function req (funcName, data) {
  return request(config, funcName, data)
}

3、全局挂载(在main.js文件如下添加)

import PromiseHttp from './api/apiPath/index'
Vue.prototype.$http = PromiseHttp

4、页面使用

 // 获取openid
    async getAsyncOpenId (parameter) {
      const res = await this.$http('getOpenId', parameter)
      if (res.success) {
        this.setOpenId(res.data.openId)
        this.setUnionId(res.data.unionId)
        this.getOpenId = res.data.openId
        this.getUnionId = res.data.unionId
        // 校验用户是否已经绑定
        this.checkUser(this.getOpenId)
      }
    },
    注释:
     1this.$http 就是全局挂载的接口请求
     2、‘getOpenId’就是apiPath定义config接口名称
     3、‘parameter’就是后台需要的参数

源码地址

gitHub地址

码云地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wocwin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值