const requests = [100, 500, 200, 1000, 400, 350, 200, 300, 100, 800]
.map((timer, index) => () => new Promise((resolve) => {
setTimeout(() => {
console.log(timer, index)
resolve(timer, index)
}, timer)
}))
function concurrent (limit, requests) {
// ...
}
concurrent(3, requests)
这是某家出名的公司初试的一个题,还是比较常能见到的,打开门就是两架电脑摆那直接上手机试,我是好久没见过这阵仗了,心里卡的贼紧,最终只有思路没完整写出来,估计过不了,还是得加强心理素质这关。但是过不了归过不了,学习还是要学,得为之后的面试做准备,趁还有印象遂赶紧记录下来。
该题是模仿网络请求的情况,数组内的数值是模仿网络请求返回的时间,要求函数实现limit数量的并发,在成功返回若干数量的请求后,要立即开始等量的请求。
首先遇到这种数量问题,先用最老实的办法,递归!递归!递归!基本上的笔试机试题七八成都能用递归去解。 下面是用递归的解法:
function concurrent (limit, requests) {
// 老样子,做啥都要先预防下入参有误导致报错,也为在递归的语句里少担心一点临界问题而出错
if (limit > requests.length) {
return
}
for (let i = 0; i < limit; i++) {
requests.shift()()
.then(() => concurrent(1, requests))
}
}
最终打印结果: