假如有几个异步操作,后一个操作需要前一个操作的执行完毕之后返回的数据才能执行下去,如果使用Node.js,就需要一层层嵌套下去,Promised对象就是针对此问题所提出来的的解决办法。
基本概念
- pending
初始状态,也称为未定状态,就是初始化Promise时,调用executor执行器函数后的状态。 - fulfilled
完成状态,意味着异步操作成功。 - rejected
失败状态,意味着异步操作失败。
回调函数:
- resolve
当pending状态转为fulfilled状态时候回调(操作成功) - reject
当pending状态转为rejected状态时候回调(操作失败)
- then()
- catch()
- all()
- race()
基本使用复制
(function(resolve,reject){
(
){ resolve(); }
{ reject(); }});复制
(function(resolve,reject){ setTimeout(function(){
num =
.random();
(num<
){ resolve(num); }
{ reject(
); }
.log(
); },
);});复制
p =
(function(resolve,reject){ setTimeout(function(){
num =
.random();
(num<
){ resolve(num); }
{ reject(num); }
.log(
); },
);});p.then(function(data){
.log(data);},function(error){
.log(
+error);});进阶使用then()
复制p.then(function(data){
.log(data);},function(data){
.log(
);
.log(data);});
- 如果then()方法中返回了一个参数值,那么返回的Promise将会变成接收状态。
- 如果then()方法中抛出了一个异常,那么返回的Promise将会变成拒绝状态。
- 如果then()方法调用resolve()方法,那么返回的Promise将会变成接收状态。
- 如果then()方法调用reject()方法,那么返回的Promise将会变成拒绝状态。
- 如果then()方法返回了一个未知状态(pending)的Promise新实例,那么返回的新Promise就是未知状态。
- 如果then()方法没有明确指定的resolve(data)/reject(data)/return data时,那么返回的新Promise就是接收状态,可以一层一层地往下传递。
复制
p =
(function(resolve,reject){ setTimeout(function(){
num =
.random();
(num<
){ resolve(num); }
{ reject(num); }
.log(
); },
);});p.then(function(data){
},function(error){
});复制
p =
(function(resolve,reject){ setTimeout(function(){ resolve(
);
.log(
); },
);});p.then(function(data){
.log(data);}).then(function(){ setTimeout(function(){
.log(
); },
);});catch()
复制
p =
(function(resolve,reject){ setTimeout(function(){
num =
.random();
(num<
){ resolve(num); }
{ reject(num); }
.log(
); },
);});p.then(function(data){
},function(error){
});复制
p =
(function(resolve,reject){ setTimeout(function(){
num =
.random();
(num<
){ resolve(num); }
{ reject(num); }
.log(
); },
);});p.then(function(data){
}).catch(function(error){
});race()
复制
p =
(function(resolve){ setTimeout(function(){ resolve(
);
.log(
); },
);});
p1 =
(function(resolve){ setTimeout(function(){ resolve(
);
.log(
); },
);});
mixedPromisesArray = [p,p1];
p3 =
.race(mixedPromisesArray).then(data=>{
.log(data);});all()
复制
p =
(function(resolve){ setTimeout(function(){ resolve(
);
.log(
); },
);});
p1 =
(function(resolve){ setTimeout(function(){ resolve(
);
.log(
); },
);});
mixedPromisesArray = [p,p1];
p3 =
.all(mixedPromisesArray).then(data=>{
.log(data);});