具体介绍
语法:
new Promise(function(resolve,reject){...}/*executor*/);
Promise构造函数执行时立即调用executor函数,resolve和reject两个函数作为参数传递给executor(executor函数在Promise构造函数返回新建对象前被调用)。resolve和reject函数被调用时,分别将Promise状态改为fulfilled和rejected。
Promise有各种开源实现,在ES6中被统一规范,由浏览器直接支持。
function test(resolve,reject){//这两个参数都是函数
var timeOut=Math.random()*2;//生成0-2之间的随机数
log('set timeout to:'+timeOut+' seconds.');
setTimeout(function(){
if(timeOut<1){//如果小于1,则等待一段时间后返回成功
log('call resolve()...');
resolve('200 OK);
}
else{//否则返回失败
log('call reject()...');
reject('timeout in '+timeOut+' seconds.');
}
},timeOut*1000);
}
可以看出,test()只关心自身的逻辑,并不关心具体的resolve和reject如何处理结果。有了执行函数,就可以用一个Promise对象来执行它,并在将来某个时刻获得成功或失败的结果。
var p1=new Promise(test);//变量p1是一个Promise对象,负责执行test函数,由于test函数内部是异步执行的
var p2=p1.then(function(result){
console.log('成功:'+result);
});//test函数执行成功
var p3=p2.catch(function(reason){
console.log('失败:'+reason);
});//test函数执行失败
Promise对象可以串联起来:
new Promise(test).then(function(result){
console.log('成功:'+result);
}).catch(function(reason){
console.log('失败:'+reason);
});
Promise最大的好处是在异步执行的流程中,把执行代码和处理结果的代码清晰的分离了。例如有若干个异步任务:
job1.then(job2).then(job3).catch(handleError);//job1,job2,job3都是Promise对象