面试中常考的源码实现|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;
		})
	)
}

你可能感兴趣的:(面试)