promise串行
Promise一单开始执行,执行上是不存在串行执行的,比如典型的计时的Promise。
const p1 =new Promise((resolve, reject) => {
setTimeout(function () {
resolve(1)
}, 1000)
})
const p2 =new Promise((resolve, reject) => {
setTimeout(function () {
resolve(2)
}, 2000)
function write(obj){
for(let key in obj){
if(obj[key]){
document.write(key + ': ' + obj[key] + '<br>');
}
}
}
var condition = {
name: null,
age: null,
addr: null
};
var func = {
getName: function(resolve,reject){
return new Promise(function(resolve,reject){
log('getName request start...')
setTimeout(function(){
log('getName request complete!')
let random = Math.random();
let ret = null;
if(random > 0.1){
condition.name = 'wangjun';
ret = {
code: 0,
time: random
};
resolve(ret);
}
else{
ret = {
name: 'getName',
code: 1,
time: random
};
reject(ret);
}
},500);
});
},
getAge: function(){
return new Promise(function(resolve,reject){
log('getAge request start...')
setTimeout(function(){
log('getAge request complete!')
let random = Math.random();
let ret = null;
if(random > 0.2){
condition.age = 20;
ret = {
code: 0,
time: random
};
resolve(ret);
}
else{
ret = {
name: 'getAge',
code: 1,
time: random
};
reject(ret);
}
},500);
});
},
getAddr: function(){
return new Promise(function(resolve,reject){
log('getAddr request start...')
setTimeout(function(){
log('getAddr request complete!')
let random = Math.random();
let ret = null;
if(random > 0.2){
condition.addr = 'shenzhen';
ret = {
code: 0,
time: random
};
resolve(ret);
}
else{
ret = {
name: 'getAddr',
code: 1,
time: random
};
reject(ret);
}
},500);
});
}
}
/**
* 串行promise
* 任一环节的then执行reject都会导致执行链直接跳到catch
* then的执行取决于前面then是否执行的resolve
*/
var promise = new Promise(function(resolve,reject){
resolve();
});
promise.then(func.getName)
.then(func.getAge)
.then(func.getAddr)
.then(function(){
write(condition);
})
.catch(function(res){
log(res.name + ' failed!');
console.log(condition);
});
promise并行
promise.all和promise.race就可以实现
这个功能Promise自身已经提供,不是本文的重点。主要是依赖Promise.all和Promise.race。
Promise.all是所有的Promise执行完毕后(reject|resolve)返回一个Promise对象。
Promise.race是任意一个Promise对象执行完毕后返回一个Promise对象。
Promise.all([func.getName(),func.getAge(),func.getAddr()]).then((res) => {
console.log(res);//返回的是三个函数执行返回的结果组成的数组;只有当三者均执行成功时才会返回结果
console.log(condition);
}).catch((res) => {
console.log(res)//当某个函数执行失败时,返回对应的返回参数;任意一个函数执行失败均会返回结果。但不影响其他函数的执行
console.log(condition);
console.log(res.name + ' falied!')
})