Skip to content

封装小程序接口请求函数

封装

js
let onAuthTimeOut = false;
const apiHost = 'http://192.168.31.119:8801';
export const requestPromise = function (
  path,
  data,
  method = 'GET',
  needToken = true,
  serverErrorWarning = true,
  options
) {
  return new Promise((resolve, reject) => {
    const headers = {};
    // 是否需要在请求头上添加token
    if (needToken) {
      const app = getApp();
      headers.token = app.globalData.userInfo?.token;
    }
    wx.request({
      url: `${apiHost}${path}`,
      header: {
        ...headers,
      },
      method,
      data,
      success(res) {
        const { data, statusCode } = res;
        const { status } = data;
        if (statusCode === 401 || status === 401) {
          // 防止重复触发
          if (onAuthTimeOut) {
            return false;
          } else {
            onAuthTimeOut = true;
          }
          // 清除登录状态
          const app = getApp();
          wx.clearStorageSync(app.globalData.tokenKey);
          app.globalData.userInfo = null;

          // 返回初始页
          const pages = getCurrentPages();
          wx.navigateBack({
            delta: pages.length,
          });

          // 重定向到登录页
          wx.redirectTo({
            url: '/pages/login/login',
          });
          // 提示信息
          setTimeout(() => {
            wx.showToast({
              title: '登录已失效,请重新登录',
              icon: 'none',
            });
            // 3s 后再恢复非过期状态
            setTimeout(() => {
              onAuthTimeOut = false;
            }, 3000);
          }, 1000);
          return false;
        }
        if (status === 500 && serverErrorWarning) {
          setTimeout(() => {
            wx.showToast({
              title: res.data.message,
              icon: 'none',
            });
          }, 1000);
        }
        const { status, data, msg } = res.data;
        if (status === 200) {
          resolve(data);
        } else {
          reject(new Error(msg));
        }
      },
      fail: (err) => {
        reject(new Error(err.errMsg));
      },
      ...options,
    });
  });
};

使用

js
import { requestPromise } from '../utils/request';
export const getAreaInfo = (data) =>
  requestPromise('/api/manager/common/byid', data);

const data = await getAreaInfo({id:1})