Promise.prototype.finally
该方法接收一个onFinally处理程序作为参数,不同于then和catch方法,该方法不关心最后落定成什么状态,只要状态由默认状态落定成功状态或失败状态,该处理程序都会执行。该方法不关心最后的结果,所以onFinally处理程序不接受参数,
let promise = new Promise((res, rej) => {
setTimeout(() => {
res('success')
}, 3000)
})
promise.finally(() => {
console.log('我执行啦')
})
//控制台打印
//我执行啦(3秒后)
let promise = new Promise((res, rej) => {
setTimeout(() => {
rej()
}, 3000)
})
promise.finally(() => {
console.log('我执行啦')
})
//控制台打印
//我执行啦(3秒后)
返回值:大多数情况该方法回原样返回父Promsie实例,但是如果处理程序返回一个pedding状态的实例或处理程序内部抛出错误(显示抛出或返回一个拒绝promsie)则会返回相应的promsie实例(待定或拒绝)
Promise.all
该方法的参数是一个可迭代对象,内部的全部的promsie解决后才会返回解决的promise实例。解决的结果就是每一个promise解决结果构成的数组
//创建几个解决的promsie实例
let promise1 = Promise.resolve(1)
let promise2 = Promise.resolve(2)
let promise3 = Promise.resolve(3)
//除了这几个解决的promise可迭代对象中还添加了数字2
let promise = Promise.all([promise1, promise2, promise3,2])
console.log(promise)
这里要注意的是,就算可迭代对象中添加的不是promise实例也会由Promsie.resolve方法包装成解决的promise实例
当然也有可迭代对象中不全是解决的promise实例的情况,继续看例子:
-
有拒绝promsie的情况,就返回这个拒绝的promsie的镜像(如果有多个拒绝,则返回第一个)
//成功的promsie实例 let promise1 = Promise.resolve(1) let promise2 = Promise.resolve(2) //失败的promsie实例 let promise3 = Promise.reject('失败啦') let promise4 = Promise.reject('又又又失败啦') let promise = Promise.all([promise1, promise2, promise3, promise4, 2]) console.log(promise)
-
有处于pending的promsie,就返回的promsie实例也处于pending状态
let promise1 = Promise.resolve(1) let promise2 = Promise.resolve(2) let promise5 = new Promise(() => {}) // let promise3 = Promise.reject('失败啦') // let promise4 = Promise.reject('又又又失败啦') let promise = Promise.all([promise1, promise2, promise5]) console.log(promise)
-
可迭代对象的元素既有拒绝的promsie实例也有处于pending状态的实例,还是返回拒绝的promsie的镜像
let promise1 = Promise.resolve(1) let promise2 = Promise.resolve(2) let promise5 = new Promise(() => {}) let promise3 = Promise.reject('失败啦') let promise4 = Promise.reject('又又又失败啦') let promise = Promise.all([promise1, promise2, promise3, promise4, promise5])
Promsie.race
这个方法正好和all方法相反,返回的新promise是这组可迭代对象中最先解决或拒绝的promise的镜像。普通的值同样会用Promise.resolve()包装
let promise1 = new Promise((res, rej) => {
setTimeout(() => {
res('YES')
}, 3000)
})
let promise2 = Promise.reject('NO')
let promise = Promise.race([promise1, promise2])
let promise1 = new Promise((res, rej) => {
setTimeout(() => {
res('YES')
}, 3000)
})
let promise2 = Promise.reject('NO')
let promise = Promise.race([promise1, promise2])
let promise1 = new Promise((res, rej) => {
setTimeout(() => {
rej('NO')
}, 3000)
})
let promise2 = new Promise((res, rej) => {
setTimeout(() => {
rej('~~~~~~~NO')
}, 2000)
})
let promise = Promise.race([promise1, promise2])
//此时打印的promsie是处于pedding状态的
console.log(promise)
//四秒后打印promise
setTimeout(() => {
console.log(promise)
}, 4000)