Promise.resolve
Promise.resolve
用来生成一个直接处于FULFILLED
状态的Promise。
Promise.resolve = function(value) {
return new MyPromise((resolve, reject) => {
resolve(value);
});
};
Promise.reject
Promise.reject
用来生成一个直接处于REJECTED
状态的Promise。
Promise.reject = function(reason) {
return new MyPromise((resolve, reject) => {
reject(reason);
});
};
race方法
接受一个promise
数组,当有一个promise
状态resolve
后,执行resolve
Promise.race = function (promises) {
return new Promise((resolve, reject) => {
if (promises.length === 0) {
resolve();
} else {
for (let i = 0; i < promises.length; i++) {
let p = values[i]; // p可能是promise 也可能是普通值
Promise.resolve(p).then(data => {
resolve(data);
}, err => {
reject(err);
return;
});
}
}
});
}
all方法
接受一个promise
数组,当所有promise
状态resolve
后,执行resolve
Promise.all = function (promises) { return new Promise((resolve, reject) => { if (promises.length === 0) { resolve([]); } else { let result = []; let index = 0; for (let i = 0; i < promises.length; i++) { promises[i].then(data => { result[i] = data; // 存起来 index++ if (index === promises.length) { resolve(result); } }, err => { reject(err); return; }); } } }); }
finally方法
不管是resolve
还是reject
都会调用finally
。
Promise.prototype.finally = function(fn) {
return this.then(value => {
fn();
return value;
}, reason => {
fn();
throw reason;
});
};
Promise.any()
方法
Promise.any()
方法同样是将多个 Promise
实例,包装成一个新的 Promise
实例。
Promise.any()
有一个子实例成功就算成功,全部子实例失败才算失败。
Promise.any = function(promiseArr) {
let index = 0
return new Promise((resolve, reject) => {
if (promiseArr.length === 0) return
promiseArr.forEach((p, i) => {
Promise.resolve(p).then(val => {
resolve(val)
}, err => {
index++
if (index === promiseArr.length) {
reject(new AggregateError('All promises were rejected'))
}
})
})
})
}
Promise.allSettled方法
Promise.allSettled跟Promise.all类似, 其参数接受一个Promise的数组, 返回一个新的Promise, 唯一的不同在于, 其不会进行短路, 也就是说当Promise全部处理完成后我们可以拿到每个Promise的状态, 而不管其是否处理成功.
promise.allSettled(promises) {
if (promises.length === 0) return Promise.resolve([])
const _promises = promises.map(
item => item instanceof Promise ? item : Promise.resolve(item)
)
return new Promise((resolve, reject) => {
const result = []
let unSettledPromiseCount = _promises.length
_promises.forEach((promise, index) => {
promise.then((value) => {
result[index] = {
status: 'fulfilled',
value
}
unSettledPromiseCount -= 1
// resolve after all are settled
if (unSettledPromiseCount === 0) {
resolve(result)
}
}, (reason) => {
result[index] = {
status: 'rejected',
reason
}
unSettledPromiseCount -= 1
// resolve after all are settled
if (unSettledPromiseCount === 0) {
resolve(result)
}
})
})
})
}