JS笔试题:实现固定数量的请求并发

247 阅读1分钟
    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))
    }
}

最终打印结果:

image.png