龙空技术网

Promise 一分钟上手使用

小林软件工作室 239

前言:

现在我们对“如何将ajax封装成一个方法”大概比较讲究,兄弟们都想要学习一些“如何将ajax封装成一个方法”的相关文章。那么小编在网上收集了一些关于“如何将ajax封装成一个方法””的相关文章,希望看官们能喜欢,朋友们一起来学习一下吧!

Promise可以封装异步请求,可以让类似文件读取,ajax变得更加优雅,那Promise具体怎么使用呢,下面是我用半天从b站的视频教程中学的基本使用方法,记录一下,后面自己要用也方便

一、promise相关知识点1、Promise的状态

实例对象的一个属性【PromiseState】

pending 未决定的resolved / fullfilled 成功rejected 失败

promise的状态改变

调用resolve函数触发pending变为resolved调用reject函数触发或者抛出错误也会触发pending变为rejected

只有这两种,且一个promise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般称为value,失败的结果数据一般称为reason。

2、promise 对象的值

实例对象的另一个属性【PromiseResult】

保存对象【成功/失败】的结果

resolvereject3、是状态先改变还是then指定的回调先执行

如果先指定的回调,也就是then先,那当状态发生改变时,回调函数就会调用,得到数据

如果先改变状态,那当指定回调,也就是then的时候,回调函数就会调用,得到数据

所以都是一样的,都可以拿到数据

4、链式调用

promise的then()返回一个新的promise,可以用then()进行链式调用,通过then()的链式调用串连多个同步/异步任务

想要中断promise调用链,有且只有返回一个pending状态的Promise对象才行

return new Promise(() = >{});
二、基本使用例子定时任务1、body里面定义好点击事件
    <div id="a">setTimeout</div>
2、js脚本中使用
    const a = document.querySelector("#a");    a.addEventListener('click',function(){    const p = new Promise((resolve,reject)=>{        setTimeout(()=>{            let n =Math.random()*100+1;            if(n<=30){                //成功                resolve(n);            }else{                //失败                reject(n);            }        },1000);    });    p.then((value)=>{        alert("成功"+value);    },(reason)=>{        alert("失败"+reason);    });  });

其实使用很简单,就是用Promise对象把异步任务包裹起来,如果异步任务运行成功,则调用resolve方法,如果异步任务运行失败则调用reject方法,然后then方法就可以渠道对应的成功失败结果。

三、基本使用例子ajax1、body里面定义好点击事件

<div id="b">ajax</div>
2、js中脚本
    const b = document.querySelector("#b");    b.addEventListener('click',function(){        const p = new Promise((resolve,reject)=>{            //1、创建对象            const xhr = new XMLHttpRequest();            //2、初始化            xhr.open('POST',';);            //3、发送            xhr.send();            //4、处理响应结果            xhr.onreadystatechange=function(){                if(xhr.readState===4){                    //判断响应状态码为2xx                    if(xhr.status >=200 && xhr.status<300){                        //alert("请求成功");                        resolve(xhr.response);                    }else{                        //alert("请求失败"+xhr.status);                        reject(xhr.status);                    }                }            }        });        p.then((value)=>{            alert(value);        },(reason)=>{            alert(reason);        });  });

其实跟上面setTimeout差不多原理

我们还可以把ajax请求直接封装为一个方法

  //封装ajax请求  function sendAjax(url){        return new Promise((resolve,reject)=>{        //1、创建对象        const xhr = new XMLHttpRequest();        //2、初始化        xhr.open('POST',url);        //3、发送        xhr.send();        //4、处理响应结果        xhr.onreadystatechange=function(){            if(xhr.readState===4){                //判断响应状态码为2xx                if(xhr.status >=200 && xhr.status<300){                    //alert("请求成功");                    resolve(xhr.response);                }else{                    //alert("请求失败"+xhr.status);                    reject(xhr.status);                }            }        }    });  }  //调用  sendAjax(";).then(value=>{    alert(value);  },reason=>{    alert(reason);  })
四、async和await结合发送ajax请求1、body里面点击事件
<div id="c">async await ajax</div>
2、js里面简单的代码
  const c = document.querySelector("#c");  c.addEventListener('click',async function(){     let res = await sendAjax(';);     console.log(res);  });

上面用的sendAjax是之前封装的,可以看出,这样封装后更加简单方便,清晰明了,页面不用每个地方都写很长的回调处理。

标签: #如何将ajax封装成一个方法