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

本文聚焦于JavaScript面试中常见的Promise方法,包括all、race、any、allSettled及finally的实现原理。通过对这些方法的深入理解,有助于提升对异步编程的掌握。
摘要由CSDN通过智能技术生成

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;
		})
	)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值