1、promise是用来解决异步的一个对象
第一,reject是用来抛出异常的,catch是用来处理异常的;
第二:reject是Promise的方法,而then和catch是Promise实例的方法(Promise.prototype.then 和 Promise.prototype.catch)。
三种状态:pending(初始化)、fulfilled(成功)、rejected(失败)
2、promise的then和catch属于微任务
链式调用原因
promise.then(res => {
// return promise
}, error => {
// return promise
}).catch(error => {
// return promise
})
3、关于promise的error
(1)如果promise内部reject或者throw一个错误,then的第二个参数error回调存在的话就会执行,不走catch,不存在就会直接走catch
例:let mypromise = new Promise((resolve, reject) => {
reject('error') 或 throw new Error(‘抛出错误')
})
第一种:mypromise.then(res => {}, error => {
// 这里执行
}).catch(error => {// 这不执行})
第二种:mypromise.then(res => {}).catch(error => { // 这里执行 })
(2)如果promise.then()抛出错误,那么只有catch能捕捉到,then的第二个参数error捕捉不到
const mypromise = new Promise((resolve, reject) => {
resolve()
})
mypromise.then(res => {
throw new Error('then抛出错误')
}, error => {
console.log(111, error)
}).catch(error => {
console.log(222, error) // 执行
})
4、promise的几种用法
(1)promise.all
处理多个promise实例,数组形式
promise.all([promise1, promise2]).then().catch
必须两个都成功才会走then,只要有一个reject了就会走catch
例:const fun1 = new Promise((resolve, reject) =>{
resolve('成功')
})
const fun2 = new Promise((resolve, reject) => {
reject(‘失败')
})
promise.all([fun1, fun2]).then(res => {
// fun1和fun2都为resolve的时候打印结果
// res['结果1', '结果2']
}, error => {
// 这个回调存在且执行
}).catch(error => {
// 否则走这里
})
(2)promise.race
用法同promise.all
区别在于:多个promise实例哪个执行的快就返回哪个,不管本身是成功还是失败状态
const fun1 = new Promise((resolve, reject) => {
setTimeout(() => { resolve('成功’) }, 1000)
})
const fun2 = new Promise((resolve, reject) => {
setTimeout(() => { resolve('成功111’) }, 300)
})
promise.race([fun1, fun2]).then(res => {
// res 为 成功111
}).catch(error => {})
(4)promise.allsettled
多个promise实例全部执行完成后,不管成功或失败都会返回,返回一个数组,各个promise实例的状态和结果
const promise1 = Promise.resolve(10)
const promise2 = new Promise((resolve, reject) =>{
setTimeout(() => {
reject(‘失败了')
}, 2000)
})
Promise.allsettled([promise1, promise2]).then(res => {
// res为一个数组,具体见图
})