配置fly.js请求

utils中的request文件

import Fly from 'flyio/dist/npm/wx'
//该位置可根据不同运行环境进行判断 
let baseUrl = 'http://myurl.cn/'
 
// 创建fly实例
let fly = new Fly()

//处理请求队列配置 
 
// 正在请求的 url 数组
let pendingArr = []
// 获取正在请求/响应的请求索引
let pendingIndex = url => pendingArr.findIndex(item => item.url === url)
// 判断是否正在请求
let isPending = url => {
    
    
  return pendingIndex(url) > -1      // 当前url正在请求中
}
// 移除完成的请求
let removePending = url => {
    
    
  pendingArr.splice(pendingIndex(url), 1)
}
// pending数组中是否含有还在进行且需要loading的request
let hasPendingWithLoading = () => {
    
    
  return Boolean(pendingArr.filter(item => item.headers.needLoading).length)
}



 
// 添加请求拦截器
fly.interceptors.request.use((request) => {
  // 给所有请求添加自定义header
  if (request.headers.needIntercept === true && isPending(request.url)) {
    
    
    // 请求重复,终止
    let err = new Error('重复请求已被拦截')
    err.request = request
    return Promise.reject(err)
  }
  wx.getNetworkType({
    
     // 每次请求时判断网络是否有问题
    complete: function (res) {
    
    
      if (res.networkType === 'none' || res.networkType === 'unknown') {
    
    
        wx.showToast({
    
    
          title: '网络不稳定,请检查网络',
          icon: 'none',
          mask: true,
          duration: 5000
        })
        return false
      }
    }
  })
  pendingArr.push(request)
  if (request.headers.needLoading === true) {
    
      // 如果需要显示loading
    wx.showLoading({
    
    
      title: '正在加载..',
      mask: true
    })
  }
  return request
})
 
// 添加响应拦截器,响应拦截器会在then/catch处理之前执行
fly.interceptors.response.use((response) => {
    
    
  removePending(response.request.url)
  !hasPendingWithLoading() && wx.hideLoading()    // 没有正在请求并且需要显示loading的,关闭loading显示
  if (Number(response.data.code) === 0) {
    
    
    // 请求成功后,只将请求结果的data字段返回
    return response.data
  }else{
    
    
		// 如果请求不成功,抛出错误。如返回 500,401等
		return Promise.reject(new Error(response.data.msg || '系统错误,请联系管理员!'))
		wx.showToast({
    
    
		  title: response.data.msg || '系统错误,请联系管理员!',
		  icon: 'none',
		  mask: true,
		  duration: 3000
		})
  }
 
}, (err) => {
    
    
  // 发生网络错误后会走到这里
  removePending(err.request.url)
  wx.hideLoading()    // 网络错误,关闭loading
  // return Promise.reject(new Error('系统错误,请联系管理员!'))
  wx.showToast({
    
    
    title: '系统错误,请联系管理员!',
    icon: 'none',
    mask: true,
    duration: 3000
  })
})
 
// 请求配置
/**
 * @param {
    
    *} url 请求接口
 * @param {
    
    *} params 请求参数
 * @param {
    
    *} method 请假方式 GET / POST
 * @param {
    
    *} needLoading  是否需要loading
 * @param {
    
    *} needIntercept  是否需要添加拦截
 */
const request = (url, params, method) => {
    
    
	
  let res = fly.request(url, params, {
    
    
    method:method, // 请求方法
    baseURL: baseUrl, // 请求基地址
    timeout: 1000 * 30, // 超时时间 30s
    headers: {
    
     // 请求头
      // needLoading:needLoading, // 自定义请求头配置 => 是否需要loading
      // needIntercept:needIntercept,
	  Accept: 'application/json',
	  'Content-Type': 'application/json;charset=UTF-8',
    }
  })
  return res
}
export default request

src==>API(接口文件的目录)===>api.js(接口文件)


import request from '../utils/request'
export default {
    
    	
	async getNewsData (param) {
    
    
	  const methodType = 'GET';
	  const url = 'toutiao/index';
	  return request( url, param, methodType);
	},
}

猜你喜欢

转载自blog.csdn.net/qq_40969782/article/details/111585222
今日推荐