一、使用场景:
处理异步任务时,避免回调地狱,可以使用return,throw 等关键词,请求图片,ajax请求等
常用方法
(1)Promise.then\ catch
包含两个参数成功,失败,一旦有结果不可逆
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
let num = parseInt(Math.random()*100)
if (num % 2 === 0) {
// 偶数
resolve(num)
} else {
// 奇数
reject(num)
}
}, 1000);
})
不可逆的例子
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
let num = parseInt(Math.random()*100)
if (num % 2 === 0) {
// 偶数
resolve(num)
} else {
// 奇数
reject(num)
}
}, 1000);
})
promise.then((num)=>{
console.log(num, 'ok')
}).catch((err)=>{
console.log(err, 'err')
})
// 一旦有结果不会发生改变,下边运行结果和上边完全一致
setTimeout(() => {
promise.then((num)=>{
console.log(num, 'ok')
}).catch((err)=>{
console.log(err, 'err')
})
}, 3000);
(2)Promise.finally
无论promise的结果是fufiled 还是rejected , finally 最终都会执行,并且没有参数
promise.then((num)=>{
console.log(num, 'ok')
}).finally(()=>{
// 无论resolve 还是reject 都会执行finally
})
(3)Promise.resolve 和 Promise.reject
可以将一个普通对象转化为promise对象
Promise.resolve('ok')
// 等同于
new Promise((resolve, reject)=>{
resolve('ok')
})
const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))
p.then(null, function (s) {
console.log(s)
});
// 出错了
(4)Promise.all
参数为数组,数组中的元素都是promise 对象,如果不是会被自动转化, 如果数组中所有promise的结果都为resolve, Promise.all的状态才会是resolve,如果有rejected,则Promise.all的最终状态就是如果有rejected
let a = new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve('ok')
},1000)
})
let b = new Promise((resolve, reject)=>{
setTimeout(()=>{
reject('no')
},1000)
})
let c = new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve({a:1})
},1000)
})
Promise.all([a,b,c]).then((data)=>{
console.log(data)
}).catch((err)=>{
console.log(err)
})
(4)Promise.race
与all方法参数相似,但不同之处在于,race的结果只受第一个结果的影响,当有一个完成后,race便有了结果
let a = new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve('ok')
},1000)
})
let b = new Promise((resolve, reject)=>{
setTimeout(()=>{
reject('no')
},1000)
})
let c = new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve({a:1})
},1000)
})
Promise.race([a,b,c]).then((data)=>{
console.log(data, '++++race')
}).catch((err)=>{
console.log(err)
})