微信小程序request的Promise封裝

? 在我們開發過程中,經常需要附帶一個token,所以這里把token單獨抽取出來。

? 可能我們的接口都是以某一個特定的前綴開始的,比如 /api, 所以我們可以提取一個baseUrl,這樣后面的請求中就可以不用每次都加上前綴了,而且后期修改也簡單,只需要改一下配置文件就可以。

? 對于后臺放回的數據,我們一般會用code來標記是否操作成功。這里可以做一個統一的錯誤處理,所以這里添加了一個攔截器數組,可以配置多個攔截器。

? 然后就是對方法的封裝,首先寫一個request方法來封裝wx.request方法。然后再分別封裝get、post、put、delete方法,使用的時候直接調用這幾個方法就可以。

? 對于header、token、interceptor、baseUrl的配置方法,我們可以直接返回this實現鏈式調用。

? 具體的在使用的時候,可以現在App.js的onLaunch方法中配置req。

import req from '../../utils/Request.js'

configReq(){
    //配置baseUrl和攔截器,baseUrl例如 /api
    req.baseUrl(config.serverUrl)
      .interceptor(res=>{
        switch(res.data.code){
          case 401: 
            wx.showToast({
              icon: 'loading',
              title: '重新登錄',
            })
            this.login()
            return false;
          case 0:
            return true;
          default:
            wx.showToast({
              title: '操作失敗',
            })
            return false;
        }
      })
  },

? 在登錄后設置token

req.token(token)

? 具體的網絡請求方法如下:

req.post('/goods',data,header)
    .then(res=>res.data.data)
    .then(data=>{
        wx.showToast({
            title:'創建成功'
        })
    })

? 代碼:

const METHOD={
  GET:'GET',
  POST:'POST',
  PUT:'PUT',
  DELETE:'DELETE'
}
class Request{
  _header={
    token:null
  }
  _baseUrl=null

  interceptors = []

  constructor(){
    const token=wx.getStorageSync('token')
    if(token){
      this._header.token=token
    }
  }

  intercept(res){
    return this.interceptors
                  .filter(f=> typeof f === 'function')
                  .every(f=> f(res))
  }

  request({url,method,header={},data}){
    return new Promise((resolve,reject)=>{
      wx.request({
        url: (this._baseUrl || '')+url,
        method: method || METHOD.GET,
        data: data,
        header: {
          ...this._header,
          ...header
        },
        success: res=>this.intercept(res) && resolve(res),
        fail:reject
      })
    })
  }

  get(url,data,header){
    return this.request({url,method:METHOD.GET,header,data})
  }
  post(url,data,header){
    return this.request({url,method:METHOD.POST,header,data})
  }
  put(url,data,header){
    return this.request({url,method:METHOD.PUT,header,data})
  }
  delete(url,data,header){
    return this.request({url,method:METHOD.DELETE,header,data})
  }

  token(token){
    this._header.token=token
    return this
  }
  header(header){
    this._header=header
    return this
  }
  baseUrl(baseUrl){
    this._baseUrl=baseUrl
    return this
  }
  interceptor(f){
    if(typeof f === 'function'){
      this.interceptors.push(f)
    }
    return this
  }
}
export default new Request
export {METHOD}

github: wxtools

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • iOS網絡架構討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,252評論 1 23
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,292評論 25 708
  • #七宗罪——貪婪# #人工智能:David# “Jarvis,你在嗎?” “我在。” 我是Jarvis,一個人工智...
    spoilers閱讀 458評論 0 0
  • 1. 我終于收拾好行李回了趟家。邁進家門的下一秒除了洗個澡蒙著被子睡一天之外,就是想好好吃頓飯平復下心情。 出門在...
    于千惠閱讀 372評論 0 1