promise的作用:ajax是异步请求,多层嵌套会造成回调地狱,promise模拟同步,将异步回调类似于同步来处理业务逻辑。
var p = new Promise(function(){
//这里用于处理异步的回调
}),必传回调函数,不传程序会抛出异常。
创建实例对象时,回调函数会立即执行。
promise的三种状态:
pending:正在进行状态
fulfilled:完成状态
rejected:失败状态
传参1 resolve,是个函数,只要这个函数执行了说明是成功状态,参数2选传,rejecte,是个函数,这个函数执行了说明是失败状态。这两个只能执行一个,变化不可逆。
promise两种结果:
从进行到失败
从进行到成功
通过rejecte(data)h或者resolve(data)将异步响应的数据提取出来,在promise外部使用。
promise的then方法,用于处理成功或者失败的回调。
//接收上面的回调
var p1 =p.then(function(res){
})。执行后返回一个promise对象,但和p不是同一个对象。当p1执行了并且return出res,就可以连缀
p1=p.then(function(res){
return res
}).then(function(data){
//处理成功回调
}).catch(function(){
//处理失败回调
})
可以简写p.then(function(res){
//处理成功信息
},function(err){
//处理异常信息
})。但一般不这样写。
使用案例如下,
document.onclick = function(){
var ps = promiseAjax("promise.php");
ps.then(function(res){
console.log(res);
}).catch(function(err){
console.log(err);
});
}
function promiseAjax(url){
var p = new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest();
xhr.open("get",url);
xhr.send();
xhr.onreadystatechange = function(){
if(this.readyState != 4){
return;
}
if(this.status == 200){
resolve(this.responseText);
}else{
reject(new Error(this.statusText));
}
}
});
return p;
}
promise的then方法是异步方法,但会优先于定时器执行。