关于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对象函数传出的值作为参数。关于ES6的新特性Promise,作用:解决异步回调的嵌套问题
关于ES6的新特性Promise,作用:解决异步回调的嵌套问题关于ES6的新特性Promise,作用:解决异步回调的嵌套问题关于ES6的新特性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这里推荐一篇比较好懂的文章,相信你看了之后一定会更有收获的。加油,走你!

https://www.cnblogs.com/lvdabao/p/es6-promise-1.html