Js Promise 用法


主要用途 : 异步请求需要多次请求,代码大同小异,维护工作量大

下面 是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); 
        });
    },

  

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM