Promise的含义
Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理,更强大。ES6将其写入了语言标准,统一了用法,原生js提供了Promise
对象。
所谓Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从语法上说Promise
是一个对象,可以通过它获取异步操作的信息。Promise
提供统一的API,各种异步操作都可以用同样的方法进行处理。
Promise的优缺点
优点
将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
缺点
1.无法取消,一旦新建就会立即执行,无法中途取消。
2.如果不设置回调函数,在Promise内抛出的错误不会反映到外部,无法得知目前的进度。
写法
Promise对象有三种状态
1.Pending,Promise对象的初始状态
2.Resolved,任务执行完成且成功的状态
3.Rejected,任务执行完成且失败的状态
Promise对象必须实现then方法,then是promise规范的核心,而且then方法也必须返回一个Promise对象,同一个Promise对象可以注册多个then方法,并且回调的执行顺序跟它们的注册顺序一致;
then方法接受两个回调函数,它们分别为:成功时的回调和失败时的回调;并且它们分别在:Promise由Pending状态转换到Resolved状态时被调用和在Promise由Pending状态转换到Rejected状态时被调用。
示例
//用promise封装ajax请求
function ajaxPromise(_url,type){
return new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest();
xhr.open(type,_url);
xhr.send();
xhr.addEventListener("readystatechange",function(){
if(xhr.readyState != 4){
return;
}
if(xhr.readyState==4&&xhr.status==200){
var res = JSON.parse(xhr.responseText);
resolve(res);
}
else{
reject();
}
})
});
}
//调用封装的ajax
ajaxPromise(baseUrl+"recommendPoetry","get").then(function(res){
console.log(res);
}).catch(function(err){
console.log("请求失败");
});
特性
立即执行性
var a = new Promise(fuction(resolve,reject){
console.log(1);
resolve(2);
});
console.log(3);
a.then((res)=>{
console.log(res);
})
// 1 3 2
不可逆性
var a = new Promise(fuction(resolve,reject){
resolve(1);
});
a.then((res)=>{
console.log(res); //1
return res+1;
}).then((res)=>{
console.log(res); //2
}).then((res)=>{
console.log(res); //undefinde
});
回调异步
var a = new Promise(fuction(resolve,reject){
resolve(1);
});
console.log(2);
a.then((res)=>{
console.log(res);
})
// 2 1