ajax使用promise的简单封装

images.png

第一次写写分享,文笔不好请见谅,使用的图片来源都是来自网络,如有侵权,请联系删除

最近在研究学习promise,在网上看了很多别人的分享,受益匪浅,然后自己研究,大概有一两天,感觉有了一点眉目。

平时的学习中经常使用到ajax就想自己试着封装一个,既能更熟悉的掌握promise又能对ajax的原理有一个了解觉得还是很值的,而且promise掌握了对后面的async也能够有一个更加清晰的认识!

首先还是先来认识为什么要使用promise吧

要说promise就不得不说以前js异步解决方法 -> 回调 ;回调这个东西解决了js没有异步的问题,让以前的前辈又多了一种解决问题的办法;

但是同时也出现了一个新的问题即回调地狱,网上有一张生动形象的图片

image

造成代码不美观(毕竟程序猿也是爱美之人吗),别人阅读起来也很难受😫

于实promise出现了,勉强解决了这种回调地狱的现象(以下这些好处总结来自百度🤭),

promise将复杂的异步处理操作简单化

让代码更具有可读性

解决异常更方便

还能链式操作

Promise的语法使用

将以往的异步回调形式改写为更加直观的promise形式举个简单的例子

let str = "hello";
    function say(fn) { 
       setTimeout(() => {
          fn(str);        
       }, 100);      
}      
say(str => { 
       console.log(str);     
 });

将这样一个简单个回调改写为promise形式的

经过简单的修改

let str = "hello";     
let say = new Promise((res, rej) => {
        setTimeout(() => { 
               res(str);       
         }, 100);     
 }).catch(e => {});      
say.then(str => {  
      console.log(str); 
});

现在你可能跟我有差不多的感受了,觉得回调和promise没有什么区别,其实大部分人才接触都有这种感觉那是因为上面局的栗子都是比较简单的,当遇到业务逻辑复杂,代码量大的时候,我相信你会爱上promise的!

说一下普通回调函数改写为promise的过程

首先和上面的说的一样你的先有一个promise对象,这个对象可以和上面一样赋值给一个引用,或者和后面封装ajax一样作为一个返回值。

然后为这个promise传入一个function作为参数,这个function里面又接受两个参数,第一个通常是当promise顺利完成时的处理办法,第二个就是出现异常时的处理了即

javascript new Promise(function (resolve,reject) { //do something})

然后在这个promise里面经行相关的业务操作,就是 do something了。

在业务操作中在合适的地方将成功的数据穿个function的第一个参数,预想到会失败时就将失败的信息传给function的第二个参数

new Promise(function (resolve,reject) { 
 //do something  

// if succeed 
 resolve(data)  

// if failed  
reject(error)
}).catch(e =>{})

最后最好在catch一下

使用promise封装ajax

如果你已经掌握了上面的promise并且你对ajax的原理有一些了解的话那么接下来的活儿,将会很轻松🤭;

ajax的原理时js的XMLHttpResquest()对象,ie7以下是ActiveXObject('Microsoft.XMLHTTP')现在好像很少会考虑兼容到ie7以下了

之后就是这对象上的一些方法使用了,原理不是很难

下面是我的封装,代码里面都有注释,其中options是ajax的配置参数(json形式的),必须传入url,否则不会发出请求,默认是GET请求方式,异步处理,这里还有一个美中不足的地方就是get请求是通过url发送的也就是需要一个对请求的数据url化。

function ajax(options) {
  //这个options时传入给ajax的配置参数
  return new Promise((resolve, reject) => {
    //返回一个promise对象 resolve成功是的处理,reject失败时的处理
    if (!options.url) { // 需要请求的路径
      console.log("请确认你的url路径");
      return;
    }
    let method = options.method || "GET"; //请求方式如果没有就默认为get
    let async = options.async || true; //ajax是否异步请求默认位true
    let xhr = new XMLHttpRequest();
    if (method === "GET") {
      xhr.open(method, options.url + "?" + Math.random(), async); //防止缓存
      xhr.send(null);
    } else if (method === "POST") {
      xhr.open(method, options.url, async);
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.send(options.data);
    }
    // xhr.responseType = options.type || "";

    xhr.onreadystatechange = () => {
      if (xhr.responseText) {
        //有数据说明相应成功
        resolve(xhr.responseText);
      }
    };
    xhr.onerror = err => {
      reject(err);
    };
  }).catch(e => {});
}

以上就是我的封装了,可以直接拿去用,当然如果上面的封装有什么问题可以联系我,毕竟我也是学习的人,大家一起学习,一起进步🤭

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355