面试中常考的源码实现|promsie相关方法(all、race、any、allsettled和finally)

Promise相关面试常撕代码 all

Promise.myAll = function (iterators) { const promises = Array.from(iterators); const num = promises.length; const resolvedList = new Array(num); let resolveNum = 0; return new Promise((resolve, reject) => { promises.forEach((promsie, index) => { Promise.resolve(promise) .then(value => { resolvedList[index] = value; if (++resolveNum === num) { resolve(resolvedList); } }) .catch(reject); }); }); };

race
Promise.myRace = function (iterators) { const promises = Array.from(iterators); return new Promise((resolve, reject) => { promises.forEach((promise, index) => { Promise.resolve(promise) .then(resolve) .catch(reject); }); }); };

any
Promise.myAny = function (iterators) { const promises = Array.from(iterators); const num = promises.length; const rejectedList = new Array(num); let rejectedNum = 0; return new Promise((resolve, reject) => { promises.forEach((promise, index) => { Promise.resolve(promise) .then(value => resolve(value)) .catch(error => { rejectedList[index] = error; if (++resolvedNum === num) { reject(rejectedList); } }) }) }) }

allSettled
const formatSettledResult = (success, value) => success ? {status: 'fulfilled', value} : {status: 'rejected', reason: value}; Promise.allSettled = function (iterators) { const promises = Array.from(iterators); const num = promises.length; const settledList = new Array(num); let settledNum = 0; return new Promise((resolve, reject) => { promises.forEach((promise, index) => { Promise.resolve(promise) .then(value => { settledList[index] = formatSettledResult(true, value); if (++settledNum === num) { resolve(settledList); } }) .catch(error => { settledList[index] = formatSettledResult(false, error); if (++settledNum === num) { resolve(settledList); } }) }) }) }

finally
Promise.prototype.finally = function (fn) { return this.then( value => Promsie.resolve(fn()).then(() => value); error => Promise.resolve(fn()).then(() => { throw error; }) ) }

    推荐阅读