所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
1.promise语法与then用法
var promise = new Promise(function(resolve,reject){
if(异步操作成功){
resolve(value);
}else{
reject(error);
}
})
resolve(value)是在Promise在已经异步完成成功(Resolved)之后执行的
reject(value)是在Promise在异步失败之后(Rejected)执行。
当然,也可以用then来指定:then(resolve,reject)
或者:then(resolve),catch(reject)
promise.then(function(value){
//sucess
},function(error){
//failure
});
promise.then(function(){
//success
}),catch(function(){
//failure
})
总结:
可以采用连续的then链式操作来写回调(这是因为返回值一直是新的Promise实例)。
以上例子可以看出来只要在第一个promise回调中添加resolve,之后的连续then就会默认执行。
可以在then中return出数据,并且这个数据会以参数的形式传入下一个then。
var promise = new Promise(function(resolve,reject){
var a=1;
resolve(a);
}).then(function(data){
console.log(data);
return ++data;
}).then(function(data){
console.log(data);
})
//打印结果依次为1 2;
catch()
var p = new Promise((resolve,reject)=> {
n
} ).then(()=>console.log('运行成功'))
.catch( ()=>{a;console.log('报错');} )//这里我们没有定义a的值会报错
.catch( ()=> console.log('报错2') )
.then( ()=>console.log('报错后的回调') )
//运行结果是:'报错2' '报错后的回调'
这里要注意,不管是then或者catch返回的都是一个新的Promise实例!而每个Primise实例都有最原始的Pending(进行中)到Resolve(已完成),或者Pending(进行中)到Reject(已失败)的过程。
Promise.all()
Promise.all方法用于将多个Promise实例,包装成一个新的 Promise实例.
var p = Promise.all([p1, p2, p3]);
all()接受数组作为参数。p1,p2,p3都是Promise的实例对象,p要变成Resolved状态需要p1,p2,p3状态都是Resolved,如果p1,p2,p3至少有一个状态是Rejected,p的状态就变成Rejected(个人感觉很像&&符号链接)
Promise.race()
var p = Promise.race([p1, p2, p3]);
上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。(感觉就是||符号操作)