Promise.resolve()
表示Promise对象成功的静态方法
const p1 = Promise.resolve('success')
console.log('p1', p1)
p1.then(res => {
console.log(res)
});
Promise.reject()
表示promise 对象失败的静态方法
const p2 = Promise.reject('error')
console.log('p2', p2)
p2.catch(err => {
console.log(err)
});
适时使用静态方法
function foo(flag) {
if (flag) {
return new Promise(resolve => {
// 可能还会有其他的异步操作
resolve('success')
});
} else {
// return 'fail'
return Promise.reject('fail')
}
}
foo(true).then(res => {
console.log('true', res)
});
foo(false).catch(err => {
console.log('false', err)
});
foo
方法返回的数据应该是一个 Promise
对象,原来的else
中返回的只是一个简单的字符串,这个肯定是不合理的,所以这里就需要用到Promise
的 reject
静态方法来返回一个 失败的 promise
对象,统一返回数据的类型,方便后面方法调用时,链式函数的书写
Promise.all()
执行成功
需求的应用场景,多张图片上传完毕后,需要执行的操作
let p1 = new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('p1')
resolve('p1')
}, 1000)
});
let p2 = new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('p2')
resolve('p2')
}, 2000)
});
let p3 = new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('p3')
resolve('p3')
}, 3000)
});
Promise.all([p1, p2, p3]).then(res => {
console.log(res)
});
从打印结果可以看出,p1 p2 p3
的 promise
函数执行完毕后,promise.all
方法中才会执行,并且输出 结果
执行失败
使用promise.all
方法时,如果几个promise
函数中有一个执行失败,触发reject
方法,那么promise.all
方法也就默认失败, 不会等待其他未执行完的promise
对象执行完成
let p1 = new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('p1')
resolve('p1')
}, 1000)
});
let p2 = new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('p2')
reject('p2')
}, 2000)
});
let p3 = new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('p3')
resolve('p3')
}, 3000)
});
// 需求的应用场景,多张图片上传完毕后,需要执行的操作
Promise.all([p1, p2, p3]).then(res => {
console.log('promise.all成功', res)
}).catch(err => {
console.log('promise.all失败', err)
});
Promise.race()
race 有着竞速的意思,和all不一样的是,只要 race参数中的 几个promise对象有一个完成了,那race方法就执行, 与promise对象的执行速度有关
let p1 = new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('p1')
resolve('p1')
}, 1000)
});
let p2 = new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('p2')
reject('p2')
}, 2000)
});
let p3 = new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('p3')
resolve('p3')
}, 3000)
});
Promise.race([p1, p2, p3]).then(res => {
console.log('promise.race成功', res)
}).catch(err => {
console.log('promise.race失败', err)
});
图片上传与promise.all
const imgArr = ["1.jpg", "2.jpg", "3.jpg"]
const promiseArr = []
imgArr.forEach(item => {
const p = new Promise((resolve, reject) => {
// 图片上传的操作
resolve('单个图片上传完成')
})
promiseArr.push(p)
})
Promise.all(promiseArr).then(res => {
console.log('图片全部上传完成', res)
})
图片加载与promise.race
图片有时会加载成功有时会加载失败,给图片设置一个超时时间。超时就现实图片加载超时,图片加载成功就显示图片
如果图片地址有效,且在规定的时间范围中,图片就会加载成功
如果图片地址无效或者加载超时,图片则会加载失败
function getImg() {
return new Promise((resolve, reject) => {
let img = new Image()
img.onload = function () {
resolve('图片加载成功')
};
img.src = 'http://www.xx.com/xx.jpg'
})
}
// 判断图片加载是否超时的计时器
function timeout() {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
reject('图片加载失败')
}, 2000)
})
}
Promise.race([getImg(), timeout()]).then(res => {
console.log(res)
}).catch(err => {
console.log(err) // 图片加载失败,因为图片地址是无效的
})
如果将图片地址设置为有效地址
img.src = 'http://www.imooc.com/static/img/index/logo.png'
Promise.race就会执行then中的函数体
Promise.allSettled()
解决Promise.all
在某些场景下的缺陷, Promise.all
在遇到一个请求失败的时候,就会直接进入catch
中,返回失败的请求,之前成功的请求也不会返回
all()请求全部成功的情况
Promise.all([
Promise.resolve({
code: 200,
data: [1, 2, 3]
}),
Promise.resolve({
code: 200,
data: [4, 5, 6]
}),
Promise.resolve({
code: 200,
data: [7, 8, 9]
})
]).then(res => {
console.log('res', res)
console.log('成功')
}).catch(err => {
console.log(err)
console.log('错误')
});
all()请求中有失败的情况
Promise.all([
Promise.resolve({
code: 200,
data: [1, 2, 3]
}),
Promise.reject({
code: 500,
data: [4, 5, 6]
}),
Promise.resolve({
code: 200,
data: [7, 8, 9]
})
]).then(res => {
console.log('res', res)
console.log('成功')
}).catch(err => {
console.log(err)
console.log('错误')
});
allSettled()处理的多并发
Promise.allSettled
会返回所有请求,不管成功还是失败,会将请求的状态一并在then
中返回
Promise.allSettled([
Promise.resolve({
code: 200,
data: [1, 2, 3]
}),
Promise.reject({
code: 500,
data: [4, 5, 6]
}),
Promise.resolve({
code: 200,
data: [7, 8, 9]
})
]).then(res => {
console.log('res', res)
console.log('成功')
}).catch(err => {
console.log(err)
console.log('错误')
});
fulfilled
表示请求成功, rejected
表示请求失败的状态
Promise.allSettled()
就是为了解决 Promise.all()
多个并发时,某个并发失败,那整个请求就失败了,并且进入catch
,无法返回其他成功的请求结果的情况。Promise.allSettled()
可以返回所有并发的状态,然后我们自己做出相应的业务判断处理,进行取值。