function guess大小() {
let num = parseInt(Math.random() * 6 + 1)
return new Promise((resolve, reject) => {
if (num > 3) {
console.log('大');
resolve('then中的大')
console.log('大2');
} else {
console.log('小');
reject('then中的小')
console.log('小2');
}
console.log('开始啦1');
setTimeout(() => {
resolve(11111)
console.log(123);
}, 000);
console.log('开始啦2');
setTimeout(() => {
console.log(66666666);
}, 2000);
}
)
}
guess大小().then(
//下面这两个是es6中函数的写法,详情参见箭头函数
res=>{
//当为小时,就不会进入这一层,下面一层.then中的res就位undefined
console.log(res);
// return '2222'
return new Promise((resolve,reject)=>{
resolve (33333)
})
},
rej=>{
console.log(rej);
}
).then(res=>{
console.log(res);
})
依次打印为
大
大二
开始啦1
开始啦2
then中的大
'333'
'123'
'456'
'66666666'
promise除了以上使用,还有两个不常用的使用方式,如果你感觉上面的还没有彻底理解,你完全可以不看,使用场景很少。
all中文含义’所有的’,由此我们不难猜测,Promise.all()就是同时执行多个Promise对象的。
let fighting = (time) => {
return new Promise((resolve, reject) => {
console.log(123);
setTimeout(() => {
resolve(`敌人还有${time / 1000}秒到达战场,全军出击`)
}, time)
})
}
let p1 = fighting(5000)
let p2 = fighting(10000)
//注意观察all参数数组中每一项的顺序
Promise.all([p1, p2]).then((result) => {
console.log(result) // [ '敌人还有5秒到达战场,全军出击', '敌人还有10秒到达战场,全军出击' ]
}).catch((error) => {
console.log(error)
})
Promise.all([p2, p1]).then((result) => {
console.log(result) // [ '敌人还有10秒到达战场,全军出击', '敌人还有5秒到达战场,全军出击' ]
}).catch((error) => {
console.log(error)
})
通过以上代码不难发现,Promise.all()参数是一个数组,数组里的一个个的Promise对象,他们传递给then的结果也是一个数组,这个数组里的顺序是和all中数组顺序一一对应的,只有在这个数组中所有的Promise对象都执行完成才会获得这个结果。catch中会得到最先捕获到的错误。在开发中,Promise.all()主要使用在需要多个异步完成后,才能进行的回调。
race中文含义’速度’,由此我们依然可以很容易猜到,Promise.race()也是同时执行多个Promise对象的。
let fighting = (time) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`敌人还有${time / 1000}秒到达战场,全军出击`)
}, time)
})
}
let p1 = fighting(10000)
let p2 = fighting(5000)
Promise.race([p1, p2]).then((result) => {
console.log(result)//敌人还有5秒到达战场,全军出击
})
##### Promise.race()中参数和Promise.all()相同,仍然是一个数组,数组里还是一个一个的Promise对象,不同的是传递给then的结果是这些Promise对象中最先执行完成的那个所传递的,是一个字符串形式。开发中,几乎很难碰到Promise.race()的使用场景。