promise概念
Promise是ES6的新特性,是异步编程的一种解决方法
1.从语法上来说: Promise是一个构造函数
从功能上来说: promise对象用来封装一个异步操作并可以获取其成功/失败的结果值
2.promise.prototytype.then():promise实例状态改变的回调函数,有两个参数:第一个是成功回调函数,第二个是失败回调函数。他会返回一个全新的promise,因此可以继续then链式调用。
3.promise.prototype.catch():失败回调函数,状态变为rejected执行。相当于promise. prototytype.then(null/undifined,rejection),如果promise内发生了错误,但却没有定义catch(),这时运行到这一行代码会报错,但是不会影响到promise后面代码的执行
一.前言
js种的异步操作有哪些
ajax请求
var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function(){}
xhr.addEventListener('readystatechange',function(){})
浏览器事件
ele.onclick=function(){}
定时
setTime(function(){}
,1000)
二.Promise 的优缺点
优点:
1、将异步操作一同步操作的方式表达出来,避免层层嵌套的回调函数
2、提供统一的操作接口,方便对异步操作的控制
缺点:
1、promise一旦建立,则不可取消
2、如果不设回调函数,则会在promise内部抛出错误,不会反应到外部
3、当状态是pending是,无法判断当前状态(是异步刚刚开始执行还是即将完成了异步操作)
三.状态
1.pending 进行中,当异步操作执行中
2.resolve 操作成功状态
3.rejected 操作失败的状态
四对原生ajax封装
const p = new Promise((resolve,reject) => {
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化
xhr.open('GET','https://api.apiopen.top/api/sentences');
//3.发送
xhr.send();
//4.处理响应结果
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
//判断响应状态码 2xx
if(xhr.status >= 200 && xhr.status < 300){
//控制台输出响应体
// console.log(xhr.response);
resolve(xhr.response);
}else{
//控制台输出响应状态码
// console.log(xhr.status);
reject(xhr.status);
}
}
}
});
//调用then方法
p.then(value => {
console.log(value);
}).catch(err=>{
console.log(err)
})
五.Promise的基本API
1.实例方法
1.then() 得到异步任务的正确结果
2.catch() 获取异步信息
3.finally() 不管Promise最后的状态如何都会执行的操作
成功与否都会执行(不是正式标准)