在我刚开始看Primise对象时,博文的长篇大论亦或官方的说法都很难让人豁然开朗,给人的感觉就是我还没有了解这是什么东西,就给我扯一堆大道理,所以这篇文章我想试着一步一步实践+解惑,文章深度可能不深,但对于小白很友好也足够你了解Promise对象。
举个例子,Promise对象就像是ajax,ajax等待响应之后进入成功函数或者是失败函数。如果一直没有响应成功或者失败,函数是不会调用的(先不算设置超时时长)。但它俩不是一个东西,只是相似。
所谓Promise,简单说是一个容器,里面保存着某个未来才会结束的事件(是一个异步操作)的结果。
这句话用代码解释:
let flag=true;
let promise=new Promise(function(resolve,reject){
setTimeout(function(){
if(flag){
resolve("success");
}else{
reject("error");
}
},2000)
});
这就是未来的两秒后反回的结果,success或者error;
打个比方这个函数可以想成两天后我生日,Promise这个朋友承诺把鼠标当做礼物给我,如果兑现了我还需要买个鼠标垫,但承诺也有无法兑现的时候,没有兑现我就要自己买个鼠标和鼠标垫。
所以承诺有三个状态:
- pending(进行中,承诺说出口时)
- fulfilled(已成功,pending=>承诺兑现)
- rejected(已失败,pending=>承诺无法兑现)
换成代码就是:
promise.then(function(x){
console.log(x+":Buy mouse pad");
}).catch(function(y){
console.log(y+":Buy mouse pad and mouse");
});
每一个Promise实例,都具有then和catch方法,fulfilled(成功)就找then方法,rejected(失败)就被catch方法捕获。前提需要等到promise调用resolve或者reject函数,否则一直不会执行之后的then或catch
- then方法是实例Promise时的第一个参数resolve的调用
- catch方法是实例Promise时的第二个参数reject的调用
突然想起来,Promise兑现承诺我还可以买一个键盘,换成代码:
promise.then(function(x){
return x+":Buy mouse pad";
}).then(function(x){
console.log(x+" and a keyboard");
}).catch(function(y){
console.log(y+":Buy mouse pad and mouse");
})
//fulfilled=success:Buy mouse pad and a keyboard
//rejected=error:Buy mouse pad and mouse
总结:
如果不用Promise就需要写一层一层的嵌套代码。有了Promise,为异步操作提供了统一的接口,让代码不陷入回调嵌套的死路中,它的强大之处在于它的链式调用。状态为fulfilled执行then方法,catch是没兑现时的原因说明。简单的了解是为了之后更深入的探索