1、Promise是es6的新特性,属于异步编程的一种解决方法。例如,可以在异步的情况下解决层层回调这种问题。
Promise对象的原型都自带all,catch和then这些方法。
2、Promise的构造函数所需的参数为一个函数,这个函数自带两个参数resolve和reject,用于对应接下来函数执行的成功和失败两种状态。
function getNumber(){
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
var num = Math.ceil(Math.random()*10); //生成1-10的随机数
if(num<=5){
resolve(num);
}
else{
reject('数字太大了');
}
}, 2000);
});
return p;
}
getNumber()
3、then()为Promise对象接下来执行的方法,可以接受两个代表resolve和reject状态的两个函数作为参数。需要注意的是,如果then中已经接受了reject参数,则之后catch中的代码无法执行
例如在以下例子中,若then接收到的状态为resolved,则跳入第一个函数,反之则第二个。
getNumber()
.then(
function(data){
console.log('resolved');
console.log(data);
},
function(reason, data){
console.log('rejected');
console.log(reason);
}
);
在以下代码中,catch中的代码无法被执行
getNumber()
.then(
function(data){
console.log('resolved');
console.log(data);
},
function(reason, data){
console.log('rejected');
console.log(reason);
}
)
.catch(function(reason){
console.log("catch:"+reason);
})
4、catch()中可以用于接受reject参数,或者接受来自resolve中的报错信息(类似try/catch)
someData未被定义,执行到这一句后立刻跳入catch中(异步报错)
getNumber()
.then(
function(data){
console.log('resolved');
console.log(someData);
console.log(data);
},
)
.catch(function(reason){
console.log("catch:"+reason);
})
5、all与race:
共同点:关于多个promise对象的并行执行
不同点:结束标准不一样,all得执行完全部对象才会结束,race则会在第一个程序结束后立马结束
用法:
有三个promise
function runAsync1(){
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
console.log('异步任务1执行完成');
resolve('随便什么数据1');
}, 1000);
});
return p;
}
function runAsync2(){
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
console.log('异步任务2执行完成');
resolve('随便什么数据2');
}, 500);
});
return p;
}
function runAsync3(){
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
console.log('异步任务3执行完成');
resolve('随便什么数据3');
}, 2000);
});
return p;
}
all:
Promise.all([runAsync1(),runAsync2(),runAsync3()])
.then(function(results){
console.log(results)
})
执行结果:
race:
Promise.race([runAsync1(),runAsync2(),runAsync3()])
.then(function(results){
console.log(results)
})
结果:
race方法可以用于限制某个方法的超时操作