关于js异步函数性能的一个面试题求赐教
各位大佬,最近参加了个面试有一个题给大家分享一下,也想听听大家的想法。 参数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个并发,直到完成