关于ES6的新特性Promise,作用:解决异步回调的嵌套问题
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
Promise对象的状态改变,只有两种可能:从pending(行将发生的)变为fulfilled(实现)和从pending变为rejected(被拒的)。
只要这两种情况发生一种,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。
重要的事情说三遍!!!
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
Promise 新建后就会立即执行。
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象函数传出的值作为参数。
说什么废话直接上代码:
var p1 = new Promise(function(resolve,reject){
setTimeout(function(){
console.log("开始")
resolve(5); //异步操作的结果为fulfilled时的,成功回调函数。
},500)
})
p1.then(function(a){
//console.log(a); //输出结果5.
var p2 = new Promise(function(resolve,reject){
setTimeout(function(){
console.log("进行中");
resolve();
},800)
})
return p2;
}).then(function(){
var p3 = new Promise(function(resolve,reject){
setTimeout(function(){
console.log("结束")
},200)
})
})
6到飞起!promise实现红路灯案例:
<style type="text/css">
ul{width: 200px;display: flex;justify-content: space-around;}
li{list-style: none;width: 50px;height: 50px;border-radius: 50%;opacity: .1;}
#green{background: green;}
#yellow{background: yellow;}
#red{background: red;}
.green #green, .yellow #yellow, .red #red{opacity: 1;} /*群组选择符。先给每个子元素添加id名,给父元素的那个class名,那个对应的子元素应用。*/
</style>
<body>
<ul id="light" class="">
<li id="green"></li><li id="yellow"></li><li id="red"></li>
</ul>
</body>
<script type="text/javascript">
//绿灯 3秒 黄灯 4秒 红灯 5秒
var oLight = document.getElementById("light");
var aLi = oLight.children;
oLight.className = "green";
function foo(val){
return new Promise(function(resolve,reject){
setInterval(resolve,val);
})
}
function data(){
foo(3000).then(function(){
oLight.className = "yellow";
return foo(2000);
}).then(function(){
oLight.className = "red";
return foo(2000);
}).then(function(){
oLight.className = "green";
data(); //循环自调用。
})
}
data();
</script>
最重要是promise能解决ajax异步请求的回调地狱,一层又一层的ajax请求的小伙伴再也不用发愁了!
<script type="text/javascript">
function Ajax(url){
return new Promise(function(resolve,reject){ //调用函数返回实例本身。返回一个为ajax操作的promise实例。
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xhr.open("get",url,true);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState==4){
if(xhr.status == 200){
var data = xhr.responseText;
resolve(data); //ajax异步操作状态为resolved时,成功回调。
}else{
reject("请求失败");//ajax异步操作状态为rejected时,失败回调。
}
}
}
})
}
Ajax("data1.json").then(function(data){
return Ajax("data2.json"); //then方法:实现链式调用ajax函数创建ajax异步操作。
},function(data){
console.log(data);
}).then(function(data){
return Ajax("data3.json");
},function(data){
console.log(data);
})
var p1 = Ajax("data1.json");
var p2 = Ajax("data2.json");
</script>
关于Promise这里推荐一篇比较好懂的文章,相信你看了之后一定会更有收获的。加油,走你!