简介
-
异步编程的一种解决方案,可以在表面上达到同步效果。
-
保存着某个未来才会结束的事件的结果,可以理解为一个容器。
-
特点
-
对象的状态不受外界影响,只有异步操作的结果可以决定当前状态。
-
三种状态: pending(进行中),resolve(已成功)和reject(已失败)
-
-
一旦状态改变,就不会再变,任何时候都可以得到这个结果。
缺点
-
无法取消Promise,一旦新建就会立即执行,无法中途取消
-
如果不设置回调函数,Promise内部抛出的错误将不会反映到外部。
-
当处于pending状态时,无法得知目前的进展到哪一个阶段。
创建Promise对象
const promise=new Promise(function(resolve,reject){ if('异步操作成功') { resolve(success); //成功状态 }else { reject(error); //失败状态 } })
Promise对象提供的方法
1.then()方法
-
该方法处理对象返回的状态
示例
promise.then(function(){ alert("成功"); //如果状态成功就执行这个函数 },function(){ alert("失败") //如果状态失败就执行这个函数 })
2.catch()方法
-
如果对象返回失败的状态,就可以捕获
示例
promise.then(function(){ alert("成功"); //如果状态成功就执行这个函数 }.catch(function(){ alert("出现异常!") //出现失败状态,才会执行异常 }))
3.finally()方法
-
无论状态如何最后都会执行
示例
promise.then(function(){ alert("成功"); //如果状态成功就执行这个函数 },function(){ alert("失败") //如果状态失败就执行这个函数 }).finally(function (){ alert("finally") //无论状态成功与否最后都会执行 })
4.all()方法
-
将所有对象合并为一个新的对象
示例
var promiseArray=[promise,promise1] //有两个promise对象的数组 Promise.all(promiseArray).then(function (){ alert("success"); //只有所有的promise对象状态都成功了才会执行成功的回调函数 },function (){ alert("error") //但凡有一个执行失败,就执行失败的回调函数 })
5.race() 方法
-
比较对象的执行速度
var phone = $("#phone").val();
//promise对象处理异步操作
var promise = new Promise(function (resolve, reject) {
setTimeout(function (){
$.ajax({
url:"/demo/phoneServlet",
type:"post",
data:"phone="+phone,
dataType:"json",
success: function (){
resolve();
},error:function ()
{
reject();
}
})
},1000)
}
var promise1 = new Promise(function (resolve, reject) {
setTimeout(function (){
$.ajax({
url:"/demo/phoneServlet",
type:"post",
data:"phone="+phone,
dataType:"json",
success: function (){
reject();
},error:function ()
{
reject();
}
})
},2000)
})
var promiseArray=[promise,promise1]
Promise.race(promiseArray).then(function (){
alert("success");
},function (){
alert("error")
})