关于js异步函数性能的一个面试题求赐教
发布于 3 年前 作者 Even0311 2514 次浏览 来自 问答

各位大佬,最近参加了个面试有一个题给大家分享一下,也想听听大家的想法。 参数urls是一个url的array。要求fetch,这里用的是伪fetch是他们自己实现的。和fetch思路一样 return一个promise

const getArnieQuotes = async (urls) => {
	// TODO: Implement this function.
	// return results;
	return Promise.all(
		urls.map(async (url) => {
			try {
				let response = await httpGet(url);
				let theKey = response.status === 200 ? "Arnie Quote" : "FAILURE";
				return { [theKey]: JSON.parse(response.body).message };
			} catch (err) {
				console.log("Please handle errpr", err);
			}
		})
	);
};

上面的代码是我的答案, 提问主要围绕着 这个代码够不够健壮,如果urls这个数组特别大怎么办, 如果我们的服务器收到类似的请求我们怎么处理。 没有特定的答案, 欢迎大家分享思路, 在下感激不尽

8 回复

限制下并行请求的数量,一个完成后接着下一个

可以试试用promise.race配合promise.all来控制并发数量

限制并发自己写的话就是别一次性把数组遍历完,分批去await promise.all()最终合并结果 要直接用的话有模块,可以用我写的 promise-all-limit 或者用的人很多的 p-all

衷心感谢各位的意见。 又学习到了新知识哈哈。

你可以看下 p-map 这个库,实现很简洁,就是用来做异步并发控制的

rxjs 的 mergeMap 操作符第二个参数可用于控制并发的数量

const tasks = [];
async function executeTask() {
	while (true) {
		const url = urls.shift();
		if (!url) break;
		await httpGet(url);
	}
}
for (let i = 0; i < 5; i++) {
	tasks.push( executeTask());
}
await Promise.all(tasks);

可以了解一下上面老哥说的rxjs 的 mergeMap。同时保持进行n个并发,直到完成

回到顶部