Promise
三种状态
- pending 初始状态
- fulfilled 胜利状态
- rejected 回绝状态
初始状态
let p = new Promise(() => {})
console.log(p);
胜利状态
let p = new Promise((resolve) => {
resolve()
})
console.log(p);
回绝状态
let p = new Promise((resolve, reject) => {
reject()
})
console.log(p);
繁多状态与状态直达
繁多状态:Promise的状态变为fulfilled或resolved不会再扭转
let p = new Promise((resolve, reject) => {
resolve()
reject()
})
console.log(p);
状态直达:resolve()接管一个Promise时会依照接管的状态传递
let rej = new Promise((resolve, reject) => {
reject()
})
let p = new Promise((resolve, reject) => {
resolve(rej)
})
console.log(rej);
console.log(p);
办法
- then
- catch
- finally
- done
- resolve
- reject
- all
- allSettled
- race
- any
- try
1.then(callback1,callback2)
接管resolve或reject的返回值,依据不同状态调用回调函数
then返回的也是Promise
,解决后fulfilled,报错为rejected
let p = new Promise((resolve, reject) => {
reject("回绝")
})
let p1 = p.then(null, res => {
console.log(res);
})
console.log(p1);
- then返回一个Promise能够持续解决
new Promise((resolve, reject) => {
reject("回绝")
}).then(null, err => {
console.log(err);
return err
}).then(err => {
console.log(err);
})
//回绝
//回绝
2.catch
等价于 .then(null,rejection)
用于指定产生谬误
时的回调函数
new Promise((resolve, reject) => {
try {
throw new Error('谬误');
}
catch (e) {
reject(e)
}//等价于 reject(new Error("谬误"))
}).then(val => {
console.log(val);
}).catch(res => {
console.log(res);
})
- catch捕捉try中抛出的谬误,而后由reject扭转状态并传递
- 谬误具备”冒泡性质”,会向下传递,直到被catch捕捉
- 反对then解决resolve,catch解决reject,catch能够去捕捉then中的谬误,相似于try/catch的写法
- resolve后再抛出谬误不会被捕捉,也不会传递到外层代码
new Promise((resolve, reject) => {
resolve("承受")
throw new Error('谬误');
}).then(val => {
console.log(val); //承受
}).catch(res => {
console.log(res);
})
3.finally
无论Promise对象最初状态是fulfilled还是rejected,都会执行其中的回调函数
finally的实现:
Promise.prototype.finally = function (callback) {
let P = this.constructor
return this.then(
value => P.resolve(callback()).then(()=>value),
reason => P.resolve(callback()).then(()=>{throw reason})
)
}
new Promise((resolve, reject) => {
reject("谬误")
}).finally(() => {
console.log(1); //1
}).catch(res => {
console.log(res);//谬误
})
- 能够看出finally执行一个一般的回调函数,状态会向下传递
4.done
最初的谬误无奈捕捉,能够用done抛出一个全局谬误
done的实现
Promise.prototype.done = function (onFulfilled,onRejected) {
this.then(onFulfilled,onRejected)
.catch(function(reason){
setTimeout(()=>{throw reason},0)
})
}
new Promise((resolve, reject) => {
reject(0)
}).done(val => {
console.log(val);
}, res => {
console.log(res);
})
- done也能够像then一样应用
5.Promise.resolve() 与 Promise.reject()
将一个对象转为Promise对象
以Promise.resolve(参数)为例
Promise.resolve("foo")
//等价于
new Promise(resolve => resolve("foo"))
- 参数为Promise的实例
-
Promise.resolve将不做任何批改
let p = new Promise((resolve, reject) => { reject("谬误") }) let p1 = Promise.resolve(p) console.log(p1);
- 参数是一个thenable对象,有then办法的对象
- Promise.resolve()会将这个对象转成Promise对象
-
而后立刻执行thenable中的then办法
let thenable = { then: function (resolve, reject) { resolve("承受") } } Promise.resolve(thenable) .then(val => { console.log(val);//承受 })
- 参数没有then办法或不是对象
-
Promise.resolve()返回一个新的Promise对象,状态为fulfilled
let obj = { a: 0 } Promise.resolve(obj) .then(val => { console.log(val.a);//a })
- 不带任何参数
-
间接返回一个fulfilled状态的Promise对象
Promise.resolve() .then(() => { console.log("承受状态");//承受转态 })
Promise.reject()也会返回一个新的Promise实例,状态为rejected
与Promise.resolve()不同的是,Promise.reject()的参数会一成不变的传递
6.Promise.all()与Promise.allSettled()
- Promise.all能够将
多个
Promise实例包装成一个
新的Promise实例 - 如果不是则会调用Promise.resolve办法,转为Promise实例
- 参数为iterable类型
-
Promise.all返回的Promise的
状态
取决于参数的状态
,全副fulfilled为fulfilled,有一个rejected
返回第一个rejectedlet p1 = Promise.resolve("胜利") let p2 = "foo" let p3 = Promise.reject("失败1") let p4 = Promise.reject("失败2") .catch(res => { console.log("本人的" + res);//本人的失败2 return res }) Promise.all([p1, p2, p4]) .then(val => { console.log(val);//["胜利","foo","失败2"] }) Promise.all([p2, p4, p3]) .then(val => { console.log(val); }) .catch(res => { console.log("all的" + res);//all的失败1 })
- 参数有本人的catch时,状态为fulfilled
- 参数中有一个rejected则会调用all上的catch
- Promise.allSettled会返回所有参数的状态与返回值
let p1 = Promise.resolve("胜利")
let p2 = "foo"
let p3 = Promise.reject("失败1")
let p4 = Promise.reject("失败2")
.catch(res => {
console.log("本人的" + res);
return res
})
Promise.allSettled([p1, p2, p4])
.then(val => {
console.log(val);
})
Promise.allSettled([p2, p4, p3])
.then(val => {
console.log(val);
})
7.Promise.race()
- 相较于Promise.all Promise.race会返回一个fulfilled或rejected的参数
- Promise.race返回的Promise的状态由跑的最快的Promise决定的
let p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "p1承受")
})
let p2 = new Promise((resolve, reject) => {
setTimeout(reject, 1500, "p2回绝")
})
Promise.race([p1, p2])
.then(val => {
console.log(val);//p1承受
})
.catch(res => {
console.log(res);
})
8.Promise.any()
-
Promise.any正好与Promise.all相同,有一个fulfilled状态就为fulfilled
let p1 = new Promise((resolve, reject) => { setTimeout(resolve, 2000, "p1承受") }) let p2 = new Promise((resolve, reject) => { setTimeout(reject, 1500, "p2回绝") }) let p3 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, "p3承受") }) Promise.any([p1, p2, p3]) .then(val => { console.log(val);//p3承受 }) .catch(res => { console.log(res); })
- 如果全副为rejected则会抛出一个全副回绝的谬误
Promise.any([p2])
.then(val => {
console.log(val);
})
.catch(res => {
console.log(res);//AggregateError: All promises were rejected
})
9.Promise.try()
让同步函数同步执行
两种实现形式
//形式一
Promise.try = function (func) {
return (async () => func())()
}
//形式二
Promise.try = function (func) {
return new Promise((resolve, reject) => {
resolve(func())
})
}
- func()如果是
同步函数
会立刻执行
,如果是异步函数会将返回值或谬误交给then解决
let f = () => console.log("now");
Promise.try(f)
console.log("next");
//now
//next
发表回复