微信小程序如何使用Promise對(duì)wx.request()封裝詳解(附完整代碼)
1. 原生wx.request()的缺點(diǎn)
- 回調(diào)地獄,可能會(huì)出現(xiàn)多層success套用的情況(用Promise封裝解決)
- 效率低,代碼冗雜,每次都要寫(xiě)共同的參數(shù)(比如headers,公共的url)
- 可維護(hù)性差,后續(xù)查看和改代碼不方便,封裝后都在同一個(gè)文件,一目了然
wx.request({ url: 'example.php', //僅為示例,并非真實(shí)的接口地址 data: { x: '', y: '' }, header: { 'content-type': 'application/json' // 默認(rèn)值 }, success (res) { console.log(res.data) } })
作為一個(gè)合格的前端開(kāi)發(fā),為了代碼質(zhì)量和可維護(hù)性(不是因?yàn)閼校?,肯定要?duì)這種代碼進(jìn)行封裝,來(lái)讓我們的代碼變得更優(yōu)雅~~
2. 封裝思路
所有的封裝思路(無(wú)論是組件還是邏輯代碼),總結(jié)起來(lái)一句話就是抽取共性。
觀察我們的網(wǎng)絡(luò)請(qǐng)求代碼,可以發(fā)現(xiàn),有很多是一樣的,如公共請(qǐng)求路徑、對(duì)響應(yīng)錯(cuò)誤的處理方法、headers參數(shù)(如token)。
不同的如具體的接口地址、請(qǐng)求類(lèi)型、請(qǐng)求參數(shù),我們封裝的時(shí)候把相同的抽取成一個(gè)文件,不同的地方再進(jìn)行傳參即可。
3. 具體實(shí)現(xiàn)代碼
先建一個(gè)api文件夾(叫什么都可以,但是為了規(guī)范化),在下面新建文件request.js
// ----http---- // api URL const apiUrl = "https://接口地址:端口";// 公共的請(qǐng)求地址 // 封裝微信請(qǐng)求方法 const request = (params) => { let url = params.url; let data = params.data; let method = params.method; let header = { "Content-Type": "application/json" }; // 鑒權(quán)驗(yàn)證,獲取登錄之后后端返回的token,存在即在頭部Authorization寫(xiě)token,具體的看后端需求 if (wx.getStorageSync("token")) { // header.Authorization = wx.getStorageSync("token"); header.token = wx.getStorageSync("token"); } return new Promise((resolve, reject) => { wx.request({ url: apiUrl + url, // api url method: method, // get/post data: data, // 請(qǐng)求參數(shù) header: header, // 頭部 success(res) { // 請(qǐng)求成功 // 判斷狀態(tài)碼---errCode狀態(tài)根據(jù)后端定義來(lái)判斷 if (res.statusCode < 399) { if (res.data.Code === 401) { wx.showModal({ title: "提示", content: "請(qǐng)登錄", showCancel: false, success(res) { wx.navigateTo({ url: "/pages/login/login", }); }, }); reject(res.data); } resolve(res.data); } else { // 其他異常 switch (res.statusCode) { case 404: wx.showToast({ title: '未知異常', duration: 2000, }) break; default: wx.showToast({ title: '請(qǐng)重試...', duration: 2000, }) break; } reject("未知錯(cuò)誤,請(qǐng)稍后再試"); } }, fail(err) { if (err.errMsg.indexOf('request:fail') !== -1) { wx.showToast({ title: '網(wǎng)絡(luò)異常', icon: "error", duration: 2000 }) } else { wx.showToast({ title: '未知異常', duration: 2000 }) } reject(err); }, complete() { wx.hideLoading() }, }); }); }; module.exports = { apiUrl, request, }
然后再按業(yè)務(wù)需求,對(duì)具體的接口地址進(jìn)行封裝,比如,我這里在api文件夾下再新建一個(gè)user.js
文件,里面放登錄,注冊(cè)的一些方法,請(qǐng)求類(lèi)型和請(qǐng)求參數(shù)根據(jù)接口文檔寫(xiě)。
import { request } from "./request" // 用戶(hù)相關(guān) // 登錄 export const login = (params) => { return request({ url: '/user/login', data: params, method: 'POST', }) } // 注冊(cè) export const register = (params) => { return request({ url: '/user/reg', data: params, method: 'POST', }) }
正式在項(xiàng)目中使用:
import { login } from '../../../api/user' // 點(diǎn)擊登錄的方法 handleLogin(){ login({ name: xxx, password: xxx, }).then((res) => { if (res.code == 200) { // 登錄成功之后的處理 } else { // 登錄失敗的處理 } }).catch((res) => {}) }
總結(jié)
到此這篇關(guān)于微信小程序如何使用Promise對(duì)wx.request()封裝的文章就介紹到這了,更多相關(guān)微信小程序用Promise對(duì)wx.request()封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
當(dāng)前流行的JavaScript代碼風(fēng)格指南
這篇文章主要介紹了當(dāng)前流行的JavaScript代碼風(fēng)格指南,同時(shí)推薦了一款風(fēng)格檢驗(yàn)工具jshint,可以配合大多數(shù)的編輯器統(tǒng)一團(tuán)隊(duì)代碼風(fēng)格,需要的朋友可以參考下2014-09-09JS中的兩種數(shù)據(jù)類(lèi)型及實(shí)現(xiàn)引用類(lèi)型的深拷貝的方法
大家都知道在JS中數(shù)據(jù)類(lèi)型按照訪問(wèn)方式和存儲(chǔ)方式的不同可分為基本類(lèi)型和引用類(lèi)型。這篇文章主要介紹了JS中的兩種數(shù)據(jù)類(lèi)型以及實(shí)現(xiàn)引用類(lèi)型的深拷貝 ,需要的朋友可以參考下2018-08-08JavaScript實(shí)現(xiàn)動(dòng)態(tài)表格的示例代碼
動(dòng)態(tài)表格是指在網(wǎng)頁(yè)上顯示的數(shù)據(jù)表格,可以根據(jù)用戶(hù)輸入或頁(yè)面元素的變化動(dòng)態(tài)更新內(nèi)容,本文主要介紹了JavaScript實(shí)現(xiàn)動(dòng)態(tài)表格的示例代碼,感興趣的可以了解一下2024-04-04requestAnimationFrame用法優(yōu)化源碼解析
這篇文章主要介紹了requestAnimationFrame用法優(yōu)化源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10document.body.scrollTop 值總為0的解決方法 比較常見(jiàn)的標(biāo)準(zhǔn)問(wèn)題
頁(yè)面具有 DTD(或者說(shuō)指定了 DOCTYPE)時(shí),使用 document.documentElement。2009-11-11簡(jiǎn)單談?wù)刯avascript代碼復(fù)用模式
這篇文章主要簡(jiǎn)單談?wù)刯avascript代碼復(fù)用模式,主要詳細(xì)介紹了類(lèi)式繼承模式中的默認(rèn)模式,希望大家能夠喜歡。2015-01-01詳解如何使用webpack打包多頁(yè)jquery項(xiàng)目
這篇文章主要介紹了詳解如何使用webpack打包多頁(yè)jquery項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02