概述
Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作)。
ES6中的promise对象, 可以将异步操作以同步的流程表达出来,很好地解决了回调地狱的问题(避免了层层嵌套的回调函数)
在使用ES5的时候,在多层嵌套回调时,写完的代码层次过多,很难进行维护和二次开发
promise对象的3个状态
-
初始化状态(等待状态):pending
-
成功状态:fullfilled
-
失败状态:rejected
使用promise的基本步骤
(1)创建promise对象
(2)调用promise的回调函数then()
<script>
//resolve-->解决问题-->事情(异步)成功完成
//reject-->拒绝-->事情(异步)操作失败
var p1 = new Promise(function(resolve,reject){
//进来之后,状态为pending
//开始执行异步操作(这里开始,写异步的代码,比如ajax请求 or 开启定时器)
if(true){
resolve('数据请求完成!');
//如果请求成功了,请写resolve(),此时,promise的状态会被自动修改为fullfilled
}else{
reject('数据请求失败!');
//如果请求失败了,请写reject(),此时,promise的状态会被自动修改为rejected
}
})
console.log(p1);
//调用promise的then()
p1.then(function(res){
console.log(res);//如果promise的状态为fullfilled,则执行这里的代码
},function(err){
console.log(err);//如果promise的状态为rejected,则执行这里的代码
})
p1.catch(function(err){
console.log('catch:',err);//获取错误方法
});
//finally不传入参数,一般不用
p1.finally(function(res){
console.log('finally:',res);//
})
</script>
代码解释:
(1)当new Promise()执行之后,promise对象的状态会被初始化为pending
,这个状态是初始化状态。new Promise()
这行代码,括号里的内容是同步执行的。括号里定义一个function,function有两个参数:resolve和reject。如下:
-
如果请求成功了,请写resolve(),此时,promise的状态会被自动修改为fullfilled。
-
如果请求失败了,请写reject(),此时,promise的状态会被自动修改为rejected
(2)promise.then()方法,括号里面有两个参数,分别代表两个函数 function1 和 function2:
-
如果promise的状态为fullfilled(意思是:如果请求成功),则执行function1里的内容
-
如果promise的状态为rejected(意思是,如果请求失败),则执行function2里的内容
Ajax案例
httpUrl = 'https://news.topurl.cn/api';
//var ajaxP = getAjax(httpUrl);
//封装
function getAjax(url) {
return new Promise(function (resolve, reject) {
var httpUrl = url;
//1.设置xhr
var xhr = new XMLHttpRequest();
//2.设置路径
xhr.open("GET", httpUrl);
//3.监听
xhr.onreadystatechange = function () {
if (xhr.status == 200 && xhr.readyState == 4) {
//处理获取得到的数据
resolve(xhr);
} else if (xhr.readyState == 4 && xhr.status != 200) {
//处理失败结果
reject(xhr);
}
};
//4.发送
xhr.send();
});
};
console.log(ajaxP);
ajaxP.then(function(res){
var result = JSON.parse(res.response);
console.log(res);
console.log(result);
}).catch(function(err){
console.log(err);
})
实现上述功能还可以用原生封装好的ajax
//fetch为原生封装好的ajax
fetch(httpUrl).then(function(res){
console.log(res);
var result = res.json();
result.then(function(result){
console.log(result);
})
})
Promise的其他方法
Promise.all():
前面例子都是只有一个Promise,使用all()方法可以包装多个Promise实例。
语法:参数只有一个,可迭代对象,可以是数组,或者Symbol类型等
Promise.all(iterable).then().catch()
Promise.race():
语法和all()一样,但是返回值有所不同,race根据传入的多个Promise实例,只要有一个实例resolve或者reject,就只返回该结果,其他实例不再执行