小程序网络请求封装 promise

今天项目的界面画完了,要为调接口坐准别了。我翻了网上的帖子,综合封装了一下,希望对入手小程序的人有帮助。

新建一个request.js 再utils目录下

request.js内容

//BaseUrl
const baseUrl = 'http://192.168.45.191:9183';

//token
var tokenKey = "token";

// 登录地址, 根据这个地址来设置token
var loginUrl = "/scf/user/user/login";

// 例外不用token的地址
var exceptionAddrArr = [
  '',//暂时是个例子
];

//剪头函数表达式得写法 (参数1, 参数2, …, 参数N) => { 函数声明 }
const http = ({ url = '', param = {}, ...other } = {}) => {
  wx.showLoading({
    title: '正在加载...'
  });
  // 记录发起请求的当前时间
  let timeStart = Date.now();
  
  return new Promise((resolve, reject) => {
    //设置header
    CreateHeader(url, function (header) {
      //发起请求
      wx.request({
        url: getUrl(url),
        data: param,
        header: header,
        ...other,
        // 接口调用结束的回调函数(调用成功、失败都会执行)
        complete: (res) => {
          console.log(`耗时${Date.now() - timeStart}`, getUrl(url));
          //为了兼容部分andriod 异步请求是隐藏不掉弹框加得延时
          setTimeout(function () {
            wx.hideLoading();
          }, 100);
          //请求成功状态吗
          if (res.statusCode == 200) {
            // console.log(res)
            //登录接口成功后设置token
            if (url === loginUrl) {
              wx.setStorage({
                key: tokenKey,
                data: res.header.token
              })
            }
            if (res.data.code === '000000') {//正常返回数据
              resolve(res.data)
            } else if (res.data.code === '900001') {//登录超时,请重新登录
              wx.showToast({
                title: res.data.message,
                icon: 'none',
                success: function () {
                  setTimeout(function () {
                    wx.navigateTo({
                      url: '../login/login',
                    })
                  }, 1000);
                  
                }
              })
            }else{//其他服务端状态码
              wx.showToast({
                title: res.data.message,
                icon: 'none',
              })
              console.log(res.data)
              reject(res)
            }
            
          } else if (res.statusCode && res.data.msg) {
            wx.showToast({
              title: res.data.msg,
              icon: 'none'
            })
            reject(res)
          } else {
            //其他状态码处理
            reject(res)
          }
        }
      })
    });
  })
}

//拼接url
const getUrl = (url) => {
  if (url.indexOf('://') == -1) {
    url = baseUrl + url;
  }
  return url
}

const _get = (url, param = {}) => {
  return http({
    url,
    param
  })
}

const _post = (url, param = {}) => {
  return http({
    url,
    param,
    method: 'post'
  })
}

const _put = (url, param = {}) => {
  return http({
    url,
    param,
    method: 'put'
  })
}

const _delete = (url, param = {}) => {
  return http({
    url,
    param,
    method: 'put'
  })
}


/** 
 * @param url:String 请求地址(根据请求地址判断是否添加token)
 * @param complete:Function 回调函数
 */
function CreateHeader(url, complete) {
  var header = {
    'content-type': 'application/json'
  }
  if (exceptionAddrArr.indexOf(url) === -1) {  //排除请求的地址不需要token的地址
    wx.getStorage({
      key: tokenKey,
      success: function (res) {
        header.token = res.data;
      },
      fail: function (error) {
        console.log(error);
      },
      complete: function () {
        complete && typeof complete === 'function' ? complete(header) : null;
      }
    });
  } else {
    complete && typeof complete === 'function' ? complete(header) : null;
  }
}

module.exports = {
  baseUrl,
  _get,
  _post,
  _put,
  _delete
}

使用:
page.js中引入:

const api = require('../../utils/request.js')

调用:

api._get('/scf/user/main/index').then(res => {
        // console.log(res.data)
        this.setData({
         
        });
        wx.stopPullDownRefresh()
      }).catch(e => {
        console.log(e + '出错啦')
        currentPageState.failed()
      })

后续再更新哦。。。喜欢的点个赞吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值