使用promise封装ajax请求

前端小技巧:使用promise封装ajax请求

前端小技巧:使用promise封装ajax请求

 

首先作为前端开发人员,大家都应该使用过Ajax发送请求,目前市面上流行的发送Ajax请求的方式为以下三种:

  • Jquery的$.ajax()
  • 尤雨溪推荐的axios
  • es6新出的fetch方法

这三种方法的区别详见文章ajax三种方式的区别,这里不再详细解释。

本篇文章主要讲工作中是如何使用ajax请求,也就是让ajax结合promise使用。

1.为什么要包装ajax?

小明同学说:“直接发送ajax请求不就得了,干嘛那么麻烦。”于是小明很顺畅的写下以下代码:

//以$.ajax发送方式为例
$.ajax({
 type:"POST",
 url:"http://localhost:5000/login",
 data:{
 username:"admin",
 password:"admin"
 },
 dataType:"json",
 success:function (data) {
 console.log(data);
 },
 error:function (err) {
 console.log(err);
 }
})

要知道,我们一个完整的项目势必会涉及到大量Ajax请求,如果我们每个请求都直接写Ajax请求,那么即使是请求同一个地址,只要发送的data参数产生了变化,就要重新写一遍ajax请求。很明显,这种写法会有以下几个缺点:

  • 代码重复率很高,过于臃肿
  • 代码可读性很差,不利于后期的维护

所以这种最"直接"的写法真所谓的费力不讨好,代码量变大,最后的效果反而不好,所以在工作中一定要避免重复劳动。前端培训

2.为什么要选择promise封装ajax?

看到上面的缺点,另外一位同学小刚说:“OK,我封装Ajax,但我直接用函数封装,不用Promise封装,那不是也可以避免重复劳动嘛。”于是小刚写下以下代码:

function ajax(url,data={},type="GET",callback){
 $.ajax({
 type:type,
 url:url,
 data:data,
 dataType:"json",
 success:function (data) {
 callback(data);
 }
 })
}
let url="http://localhost:5000/login";
let data={
 username:"admin",
 password:"admin"
 }
function callback(data){
 console.log(data)
}
ajax(url,data,"GET",callback);
ajax(url,data,"POST",callback);

确实,直接用函数封装的写法可以克服重复书写Ajax的缺点,但是还是无法解决“回调地狱”的问题,也就是当如果有多个回调处理函数时,如:f1(f2(f3)),但是采用Promise封装ajax请求就可以完美解决这个问题,最后写出以下代码:

function ajax(url,data={},type="GET"){
 return new Promise((resolve, reject) => {
 $.ajax({
 type:type,
 url:url,
 data:data,
 dataType:"json",
 success:function (data) {
 resolve(data);
 },
 error:function (err) {
 reject(err);
 }
 })
 })
 }
let url="http://localhost:5000/login";
let data={
 username:"admin",
 password:"admin"
 }
let promise=ajax(url,data,"GET");//注意这里返回的是promise对象
promise.then(data=>{ //f1为第一个回调处理函数
 f1(data); 
 }).then(data2=>{ //f2为第二个回调处理函数
 f2(data2);
}).catch(err=>{
 console.log(err);
})

一下这一行代码很重要,一定要记住:

 return new Promise((resolve, reject) => {
 
 })
posted @ 2022-02-11 14:40  Linux运维阿铭  阅读(139)  评论(0编辑  收藏  举报