微信小程序開發——使用promise封裝異步請求


前言:

有在學vue的網友問如何封裝網絡請求,這里以正在寫的小程序為例,做一個小程序的請求封裝。

關於小程序發起 HTTPS 網絡請求的Api,詳情可以參考官方文檔:wx.request(Object object)

如果直接使用官方提供的個Api,那么每次在進行網絡請求調用時,我們都要按官方文檔上說的那樣傳遞需要設置的請求參數,然后對不同的請求相應結果做不同的處理。但是前端同服務器端的接口請求中有大部分的請求參數以及響應結果處理都是很類似的,也就沒有必要對所有請求代碼都重新敲敲一遍,那么對原生的網絡請求進行封裝就有必要了。

網絡請求封裝:

如果接口比較多,可以創建兩個文件,完成網絡請求的封裝:

1. http.js

 1 /**
 2  * 封裝http 請求方法
 3  */
 4 const apiUrl = "https://www.xxx.cn"; //服務器api地址
 5 const http = (params) => {
 6   //返回promise 對象
 7   return new Promise((resolve, reject) => {
 8     wx.request({
 9       url: apiUrl + params.url,//服務器url+參數中攜帶的接口具體地址
10       data: params.data,//請求參數
11       header: params.header || {
12         "Content-Type": "application/x-www-form-urlencoded"//設置后端需要的常用的格式就好,特殊情況調用的時候單獨設置
13       },
14       method: params.method || 'POST',//默認為GET,可以不寫,如常用請求格式為POST,可以設置POST為默認請求方式
15       dataType: params.dataType,//返回的數據格式,默認為JSON,特殊格式可以在調用的時候傳入參數
16       responseType: params.responseType,//響應的數據類型
17       success: function(res) {
18         //接口訪問正常返回數據
19         if (res.statusCode == 200) {
20           //1. 操作成功返回數據,原則上只針對服務器端返回成功的狀態(如本例中為000000)
21           if (res.data.retCode == "000000") {
22             resolve(res.data)
23           } else if(params.url == "/order/result" && res.data.retCode == "800020") {//支付結果未知      
24             //需要特殊處理的接口,可以單獨列出來返回數據
25             resolve(res.data)
26           } else {
27             wx.showToast({
28               icon: "none",
29               title: res.data.retMsg
30             })
31             console.log(res.data)
32           }
33         } else {
34           //2. 操作不成功返回數據,以toast方式彈出響應信息,如后端未格式化非操作成功異常信息,則可以統一定義異常提示
35           var errMsg = res.data.message
36           errorToast();
37           console.log(res.data)
38         }
39       },
40       fail: function(e) {
41         errorToast();
42         reject(e)
43       }
44     })
45   })
46 }
47 module.exports = {
48   http: http
49 }

注:上邊代碼中已經注釋比較詳細了,就不再贅述了。

2. api.js

 1 import {
 2   http
 3 } from '../utils/util.js'
 4 
 5 var url = {
 6   userLogin: "/user/login", 
 7   getUserPhone: "/user/phone", 
 8   ...
 9   userCardReceive: "/card/receive" 
10 }
11 module.exports = {
12   userLogin(code) {
13     return http({      
14       url: url.userLogin,
15       data: { code: code},
16       header: {
17         "Content-Type": "application/x-www-form-urlencoded"
18       }
19     })
20   },
21   getUserPhone(params) {
22     return http({
23       url: url.getUserPhone,
24       data: params
25     })
26   },
27   ...
28   userCardReceive() {
29     return http({
30       url: url.userCardReceive,
31       method:"GET"
32     })
33   },
34 }

注:以函數封裝請求,並以回調函數的方式返回請求結果。具體參數可根據需要單獨設置。

調用方式:

1       http.getUserPhone(params).then(data => {
2         if (data) {
3             //返回結果的處理邏輯
4             ...
5         }
6       })        

個人原創博客,轉載請注明來源地址:https://www.cnblogs.com/xyyt/p/9715367.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM