主要用途 : 异步请求需要多次请求,代码大同小异,维护工作量大
下面 是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); }); },