Promise,生成器Generator,async await

  • Post author:
  • Post category:其他


Promise是为了AJAX请求变得更加优雅,Promise并不能发送请求,是为了解决回调地狱。

Promise主要是为了解决js中多个异步回调难以维护和控制的问题。

在ES6中,Promise对象是一个构造函数,用来生成promise实例。

Promise构造函数,接收一个函数作为参数,该函数有两个参数,分别是resolve,reject(这两个是函数,由js引擎提供,不用自己部署)

Promise实例生成以后,可以用then方法分别指定resolved,rejected状态的回调函数。

then方法接受两个回调函数作为参数:

1.Promise对象变成resolved时调用,

2.Promise对象变成rejected时调用。



ajax结合promise发送网络请求

var getData=function(url,type,data){
   
	var promise=new Promise(function(resolve,reject){
   
		var xmlhttp;
		if(window.XMLHttpRequest){
   
			xmlhttp=new XMLHttpRequest();
		}else{
   
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
		xmlhttp.open(type,url);
		xmlhttp.onreadystatechange=function(){
   
			if(xmlhttp.readyState!==4){
   
				return;
			}else{
   
				if(xmlhttp.status>=200&&xmlhttp.status<300 || xmlhttp.status===304){
   
					resolve(xmlhttp.responseText);
				}else{
   
					reject(new Error(xml.xmlhttp));
				}
			}
		}
		if(type=='get'){
   
			xmlhttp.send();
		}else{
   
			xmlhttp.setRequestHeader("Content-Type","application/json");
			xmlhttp.send(JSON.stringify(data));
		}
	});
	return promise;
}



Promise串行

一个异步请求完了之后再进行下一个请求

queryThen(){
   
	getData('/get1','get')
	.then(res=>{
   
		console.log(res);
		return getData('/get2','get');
	},err=>{
   
		console.log(err);
	})
	.then(res=>{
   
		console.log(res);
	},err=>{
   
		console.log(err);
	})
}



Promise并行

多个异步请求同时进行,这些异步请求都成功了之后才会返回结果,其中任何一个没有成功,都拿不到结果。

Promise.all([
	getData('/get1','get')
	.then(res=>{
   console.log(res)}),
	getData('/get2','get')
	.then(res=>{
   console.log(res)})
])
var p1=new Promise(function(resolve,reject){
   
	getData



版权声明:本文为qq_41217480原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。