最近在准备面试,关于 promise 是面试的热点和考点。不定面试官心情好了就会让你写个 promise 的 api
废话不多说,下面是我写的代码,如有不严谨之处希望指出。
promise.all
当所有 promise 全部 resolve 或者 一个 reject 时,返回结果。
function myPromiseAll(promiseArr) {
let length = promiseArr.length;
let resolvedNum = 0;
let resultArr = [];
return new Promise((resolve, reject) => {
for (let i = 0; i < length; i++) {
Promise.resolve(PromiseArr[i]).then(
(value) => {
resultArr[i] = value;
resolvedNum++;
if (resolvedNum === length) {
return resolve(resultArr);
}
},
(err) => {
return reject(err);
}
);
}
});
}
promise.resolve
如果原本就是 promise 类型的,那么直接返回。如果是有 then 属性的对象,且then属性是个函数的,就返回一个 promise,这个 promise 中的方法用这个 then 属性。如果是一个值的话,就直接作为 promise,且在 resolve 中传入这个值。
function myPromiseResolve(value) {
if (value instanceof Promise) {
return value;
}
if (
Object.prototype.toString.call(value) === "[object Object]" &&
typeof value.then === "function"
) {
return new Promise(value.then);
}
return new Promise((resolve) => {
resolve(value);
});
}
promise.race
返回第一个结束的 promise 的值
function myPromiseRace(promiseArr) {
let checkFirst = true;
return new Promise((resolve, reject) => {
for (let i = 0; i < promiseArr.length; i++) {
Promise.resolve(promiseArr[i]).then(
(value) => {
if (checkFirst) {
checkFirst = false;
resolve(value);
}
},
(err) => {
if (checkFirst) {
checkFirst = false;
reject(err);
}
}
);
}
});
}