①注:door()中只能传一个变量,如果必须传多个值,则可以将多个值放在数组或对象中整体传入
②错误处理:任何一个支持promise的函数中都有另一扇门( .catch()
)。如果当前异步任务执行过程中发生错误,就可以从另一扇门出来。一旦报错从这扇门出来,后续 .then() 都不会再执行,凡是从这扇门出来的代码都进入.catch()
中执行错误处理操作
③Promise中有几种状态?
解:三种。
pending(挂起:异步任务正在执行中,尚未执行完毕)
resolve(同意:异步任务执行完成,且执行成功,主动调用door()函数,会将 Promise 对象的状态改为 resolve。当Promise对象的状态改为resolve后,就会自动执行.then()
中的函数)
reject(拒绝:异步任务执行完成,且执行失败,主动调用err()函数,会将 Promise 对象的状态改为 reject。当Promise对象的状态改为reject后,就会自动执行.catch()
中的函数))
④door(val)能用return代替吗?
解:不能!因为door()不仅有返回值的作用,还有修改Promise状态的作用
例1:
<script>
//es6——Promise 练习
function zha() {
return new Promise(function(door) {
var ice = `冰淇淋`
console.log(`炸炸拿着${ice}起跑`)
setTimeout(() => {
console.log(`炸炸到达终点`)
console.log(`炸炸开门`)
door(ice)
}, 1000)
})
}
function sasa(ice) {
return new Promise(function(door) {
console.log(`飒飒拿着${ice}起跑`)
setTimeout(() => {
console.log(`飒飒到达终点`)
console.log(`飒飒开门`)
door(ice)
}, 1000)
})
}
function rong(ice) {
return new Promise(function(door) {
console.log(`绒绒拿着${ice}起跑`)
setTimeout(() => {
console.log(`绒绒到达终点`)
console.log(`比赛结束`)
}, 1000)
})
}
zha()
.then(sasa)
.then(rong)
</script>
例2
若每个异步函数都返回一个返回值,如何获得所有返回值?
解决:.then(function(arr){...})
其中—— arr数组中保存了Promise.all中所有异步函数通过door()返回的执行结果
强调——arr 中返回值存储顺序与异步函数执行完成的顺序无关,只与调用顺序有关
<script>
// Promise.all 练习
function zha() {
return new Promise(function(door) {
var ice = `炸炸的冰淇淋`
console.log(`炸炸拿着起跑`)
setTimeout(() => {
console.log(`炸炸到达终点`)
console.log(`炸炸开门`)
door(ice)
}, 1000)
})
}
function sasa() {
return new Promise(function(door) {
var ice = `飒飒的冰淇淋`
console.log(`飒飒拿着起跑`)
setTimeout(() => {
console.log(`飒飒到达终点`)
console.log(`飒飒开门`)
door(ice)
}, 1000)
})
}
function rong() {
return new Promise(function(door) {
var ice = `绒绒的冰淇淋`
console.log(`绒绒拿着起跑`)
setTimeout(() => {
console.log(`绒绒到达终点`)
console.log(`绒绒开门`)
door(ice)
}, 1000)
})
}
Promise.all([
//数组中要求必须传入new Promise对象
zha(),
sasa(),
rong()
])
.then(arr => console.log(`比赛结束${arr}`))
.catch(error => {
console.log(error)
})
</script>