1、promise是一个构造函数,那就new一个出来
var p = new Promise(function(resolve,reject){//做一些异步操作
setTimeout(function(){
console.log("执行完成");
resolve("随便什么数据");
}, 2000);
});
①Promise函数中有两个参数resolve(异步操作执行成功后的回调函数,将Promise的状态置为fullfiled)和reject(异步操作执行失败后的回调函数,将Promise的状态置为rejected)
②在上边的代码中,我们只是new了一个p对象,并没有调用它,但是传进去的函数就执行了,2秒后输出“执行成功”,并且调用resolve方法。所以我们用promise的时候一般是包在一个函数中,在需要的时候去调用这个函数。
function test(){
var p = new Promise(function(resolve,reject){
//做一些异步操作
setTimeout(function(){
console.log("执行完成");
resolve("随便什么数据"); //执行成功的回调
}, 2000);
});
return p; //返回一个promise对象
}
test();
2、promise的用法(4种)
- resolve、reject的用法
- catch的用法
- all的用法
- race的用法
1)resolve、reject的用法
function getNumber(){
var p = new Promise(function(resolve,reject){
//做一些异步操作
setTimeout(function(){
var num = Math.ceil(Math.random()*10); //0-10之间的随机数
if(num <= 5){ //将num<=5作为成功状态
resolve(num); //成功回调
}else{
reject("数字太大"); //失败回调
}
}, 2000);
});
return p;
}
getNumber().then( //在getNumber中传入resolve、reject的数据并返回p,能在then方法的data中拿到
function(data){ //成功回调
console.log("resolved");
console.log(data);
},
function(data){ //失败回调
console.log("rejected");
console.log(data);
}
);
【注】then方法接受两个参数,第一个对应resolve的回调,第二个对应reject的回调,多次运行这段代码,可随机得出以下两种结果
或者
【重点】只有在promise函数中定义了resolve()或者reject才会执行then方法
2)catch方法的用法
用法①:和then的第二个参数一样,指定reject的回调
用法②:在执行resolve的回调时,如果代码出错,就会进入catch中,此时错误原因会传入catch的data中
getNumber().then(
function(data){ //成功回调
console.log("resolved");
console.log(data);
}
).catch(
function(data){ //失败回调
console.log("rejected");
console.log(data);
}
);
3)all的用法
提供了并行执行异步操作的能力,并且在所有的异步操作执行完后才执行回调。
Promise
.all([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
console.log(results);
});
all接受一个数组参数,等他们都执行完后,将结果放进一个数组中传给then,也就是上边的results。
4)race的用法
用法类似all,不过all是以跑的慢的为准执行回调,而race是以跑的快的为准执行回调