Promise.resolve()
将现有对象转为 Promise 对象
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
Promise.resolve = function (res) {
return new Promise((res) => {
resolve(res)
})
}
Promise.prototype.catch
Promise.prototype.catch = function (fn) {
return this.then(null, fn)
}
Promise.prototype.finally
finally()
方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。
且不能传递参数,所以无法获取这个实例的状态。但还要返回这个状态结果。
Promise.prototype.finally=function(onFinished){
return this.then((result)=>{
onFinished()
return result
}).catch((e)=>{
onFinished()
return e
})
}
Promise.all()
返回Promise实例,接收参数为一个数组,当有不是Promise的实例的时候,会调用Promise.resolve方法转化。
返回第一个被reject的实例给回调函数
Promise.all = function (promises) {
let results = []
let promiseCount = 0;
let promisesLength = promises.length;
return new Promise((resolve, reject) => {
for (let val of promises) {
Promise.resolve(val).then(function (res) {
results[promiseCount] = res;
promiseCount++;
// 当所有函数都正确执行了,resolve输出所有返回结果。
if (promiseCount === promisesLength) {
return resolve(results);
}
}, function (err) {
return reject(err);
});
}
})
}
Promise.any
//Promise.any 和all相反 所有都rejected时候返回 AggregateError: All promises were rejected
Promise.any=function(promises){
let errorcount=0
let promiselength=promises.length
return new Promise((resolve,reject)=>{
for(let val of promises){
Promise.resolve(val).then(function(res){
return resolve(res)
},function(e){
errorcount++
//所有都reject的话 返回这个错误
if(errorcount===promiselength)
{
return reject(new AggregateError('All promises were rejected'))
}
})
}
})
}
Promise.race
传入一个数组。竞争关系,返回第一个完成的实例。
//promise.race
Promise.race=function(promises){
return new Promise ((resolv,reject)=>{
for(let val of promises){
return Promise.resolve(val).then(function(res){
return resolv(res)
},function(e){
return reject(e)
})
}
})
}
Promise.allSettled
Promise.allSettled=function(promises){
let allresult=[]
let count=0
let promiselength=promises.length
return new Promise((resolve,reject)=>{
for(let val of promises){
Promise.resolve(val).then(function(res){
allresult[count]={state:'fulfilled', value:res};
count++
},function(e){
allresult[count]={state:'rejected', value:e};
count++
}).finally(()=>{
if(promiselength==count)
resolve(allresult);
})
}
})
}