主要用途 : 異步請求需要多次請求,代碼大同小異,維護工作量大
下面 是ES6 簡單封裝 Promise 用法
文章用意: 主要是理解 promise 以及如何解決異步多次請求造成的閱讀困難等問題!
下面給出具體實現代碼以及測試截圖:
// url 相當於ajax 的一下參數,目前我這里只有url request({ url: "https://xxxxx/api/public/v1/home/swiperdata" }) .then(result => { this.setData({ switchlist: result.data.message }); //我們在調用 第二個請求, 將在第二個then 中執行,並且獲取 return request({ url: "https://www.cgrain.top/xxxxx", method: "Get", data: { "test": result.data.message[0].open_type } }); }) // 假如 還有個ajax 只需要一直then 下去就可以了 .then(result => { console.log(result); return request({ url: "https://www.cgrain.top/xxxxx", method: "Get", data: { "test":"手動增加,第三" } }); }) .catch(err => { console.log(err); }) .then(result=>{ console.log(result); })
export const request = (parame) => { return new Promise((resolve, reject) => { wx.request({ ...parame, success: (result) => { resolve(result); }, fail: (err) => { reject(err); } }); }) }

html 測試(貌似不兼容ie)
1 promise.js 2 3 function Ajaxfun(prame) { 4 return new Promise((resolve, reject) => { 5 $.ajax({ 6 ...prame, 7 success: (reselt) => { 8 resolve(reselt); 9 }, 10 error: (error) => { 11 reject(error); 12 } 13 }); 14 }); 15 }
1 <script> 2 Ajaxfun({ url: "https://cgrain.top/api/xxx" }).then(resule => { 3 console.log(resule); 4 }).catch(resule => { 5 console.log(resule); 6 }); 7 8 </script>
更新-------- 這樣子寫, 經過編譯,其實變成了這樣:
1 export const request = (parame) => { 2 ajaxTimes++; 3 wx.showLoading({ 4 title: "數據加載中...", 5 mask: true 6 }); 7 ///封裝url 全局統一 8 const baseUrl = "https://api.zbztb.cn/api/public/v1"; 9 return new Promise((resolve, reject) => { 10 // debugger 11 wx.request({ 12 ...parame, 13 url: baseUrl + parame.url, 14 success: (result) => { 15 resolve(result); 16 }, 17 fail: (err) => { 18 reject(err); 19 }, 20 complete: () => { 21 ajaxTimes--; 22 if (ajaxTimes == 0) { 23 wx.hideLoading(); 24 } 25 } 26 }); 27 28 }) 29 }
編譯過的:
1 // 同時 發送異步代碼次數 2 var ajaxTimes = 0; 3 4 var request = function request(parame) { 5 ajaxTimes++; 6 wx.showLoading({ 7 title: "數據加載中...", 8 mask: true 9 }); ///封裝url 全局統一 10 11 var baseUrl = "https://api.zbztb.cn/api/public/v1"; 12 return new Promise(function (resolve, reject) { 13 // debugger 14 wx.request(_objectSpread({}, parame, { 15 url: baseUrl + parame.url, 16 success: function success(result) { 17 resolve(result); 18 }, 19 fail: function fail(err) { 20 reject(err); 21 }, 22 complete: function complete() { 23 ajaxTimes--; 24 25 if (ajaxTimes == 0) { 26 wx.hideLoading(); 27 } 28 } 29 })); 30 }); 31 }; 32 33 exports.request = request; 34 35 });
博客園也用到了Promise
更新寫法
const res = await request({ url: "/goods/detail", data: { "goods_id": goods_id } });
直接接收 成功返回的值
更新 [基於 axios 進行的二次封裝]
1 /* 我們對 axios 進行二次封裝 原因是 ,盡可能的 減少我們 個個請求依賴 axios , 2 而集中控制我們的請求 都來自與這個js 的這個 request 方法,這樣 ,我們 需要換其他請求庫,就不用每個頁面都改 , 3 而只要 把 request 方法改一下就行了, 上層代碼 不過於依賴底層,減少耦合 ---> 依賴倒置 4 現在這個 文件,就相當於 抽象接口,所有 請求都要集成它 5 */ 6 export function request(config) { 7 //1 創建axios 實例 8 const instance = axios.create({ 9 baseURL: 'api', 10 timeout: 5000 11 }); 12 13 // 3 對請求進行攔截,這個自己有需要 就可以寫 14 instance.interceptors.request.use(config => { 15 //攔截成功請求 ,比如 16 //1 加載動畫 17 //2 檢查url 增加 token 18 19 // 假如不返回,就會出錯,記住我們還需要返回過去 20 console.log("axios 成功攔截",config); 21 return config 22 }, err => { 23 //攔截失敗請求 24 console.log("axios 失敗攔截",err); 25 return err; 26 }); 27 //3 對響應進行攔截 28 instance.interceptors.response.use(result=>{ 29 30 console.log(" axios 響應成功攔截",result); 31 //這里 對所需要的數據進行返回 32 return result.data.data; 33 },errlesult=>{ 34 console.log(" axios 響應失敗攔截",errlesult); 35 // 比如 返回 401 無權限, 404 頁面找不到, 500 服務器錯誤 就在這里 36 37 return errlesult; 38 }); 39 40 // 2 調用 axios 實例,並且返回 41 return instance(config); //axios 本身就用了 promise 42 }
request({ url: "/home/multidata" }).then(res=>{
console.log(res);
});
2021-7-31 更新
Health(this.account, this.model) .then((result) => { return PostCaptche(result.response.captchaType); // 這是另外一個方法,需要第一個接口返回的參數 }) .then((res) => { if (res) { return; } this.CaptchaStatus("驗證碼加載中...", false); } }) .catch((err) => { // 他們會共用一個catch this.$Loading.error(); this.CaptchaStatus("安全檢測失敗", false); }); },