小程序原生 请求封装

2022-01-14  本文已影响0人  litielongxx

提取原因

小程序提供了wx.request之类的方法,但是比如异步改为同步。

const {code,data}=await xx()
if(code=200){}

以上就为正常的js顺序(js中分为异步和同步,简单理解就是顺序执行,先来后到即为同步)则不支持。
且各种状态码200,403统一拦截,get/put/del/update万一后台统一规范很是头大。
为了一劳永逸,省心又省代码所以有了提取(封装说法也成)。
目录结构:


image.png

api 请求相关
api 每个接口在线地址
request 提取的get、post之类请求
public 多为公共的方法比如日期上传之类,一般也为utils工具名

api目录下

api.js

const requestFn = require("./request");

const API = {
  //  获取链接地址
  getUrl: "/xx/getUrl",
};

const HTTP = {
  /**
   * banner
   * @param {String} userId - 用户ID
   * @param {String} appClientTypeCode - 设备端类型DICT_APP_CLIENT_TYPE_CODE_ANDROID(安卓DICT_APP_CLIENT_TYPE_CODE_IOS(苹果)
   */

  getUrl(data) {
    return requestFn.Request({
      url: API.getUrl,
      data,
    // method:'GET',不传默认'POST'
    });
  },
};

module.exports = HTTP;

request.js
尤其注意两句注释,不能漏看。

const app = getApp();
const baseURL = app.globalData.baseURL;
const FN = require('../public/public');

const Request = (options) =>{
  return new Promise((resolve, reject) => {
    FN.Loading(1);
    wx.request({
      url: baseURL + options.url || '',
      data: options.data || {},
      method: options.method || 'POST',
      header:{'content-type': "application/x-www-form-urlencoded"},
      responseType:options.responseType || "",
      timeout:15000,
      success (res) {
        FN.LoadingOff();
    // 根据打印的res具体返回具体修改调整下,比如res.data.status不一定等于xx
   //  返回的提示信息也不一定是info,也可能后台返回为msg
        if(res.statusCode === 200){
          if(res.data.status === "xx"){
            resolve(res.data);
          }else{
            FN.Toast(res.data.info);
          };
        }else{
          FN.Toast(res.errMsg);
        };
      },
      fail (res) {
        FN.Toast("网络开小差了");
        reject(res);
      }
    })
  })
};

module.exports = {
  Request
};

使用页面

import Http from "../../../api/api.js";
console.log('role',Http)
// 路径非唯一自行调整
onLoad() {
Http.getStudentInfo({
      code:1
    }).then((res) => {
      console.log(res)
    }).catch(err=>{
      console.log('错误',err)
 })
}

catch和then涉及promise语法中的resolve和reject,为语法糖(没有任何意义的标识,比如p约定俗称为标签一样,代表通过或拒绝),此为es6语法,第一段代码中可用es后续es async和await提升美化度。
原文参考:
ps:https://www.cnblogs.com/-pdd/p/14292614.html

上一篇 下一篇

猜你喜欢

热点阅读