Skip to content

Commit

Permalink
feat(请求并发控制)
Browse files Browse the repository at this point in the history
  • Loading branch information
lv-z-l committed Oct 16, 2023
1 parent 5eda18b commit 6eed946
Showing 1 changed file with 91 additions and 0 deletions.
91 changes: 91 additions & 0 deletions articles/write/concurrency-conrol.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
---
title: 请求并发控制——字节面试题
author: lvzl
---

```js
// -----------------mock一些请求
const request1 = () =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
});

const request2 = () =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2);
}, 500);
});
const request3 = () =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3);
}, 300);
});
const request4 = () =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(4);
}, 400);
});
```
实现一个 scheduler 函数,满足以下要求:
1. 接收一个参数 max 控制最大并发请求量
2. 执行以下代码依次输出:2、3、1、4
```js
const addRequest = scheduler(2);
addRequest(request1).then(res => {
console.log(res);
});
addRequest(request2).then(res => {
console.log(res);
});
addRequest(request3).then(res => {
console.log(res);
});
addRequest(request4).then(res => {
console.log(res);
});
```

```js
function scheduler(max) {
// 存储待发请求
const reqs = []
// 请求中的数量
let requesting = 0
// 返回一个函数,接收一个参数,添加请求,并返回请求对应的响应
return function(request) {
const runTask = () => {
// 只要有待发请求,并且满足请求中数量小于并发控制
while(reqs.length && requesting < max) {
// 取出执行
const newReq = reqs.shift()
// 请求中的数量++
requesting++
newReq().then(num => {
// 执行成功后请求中的数量--
requesting--
// 接着调用别的请求
runTask()
// 调用各自的resolve
newReq.reslove(num)
})
}
}
return new Promise((resolve) => {
// 每个请求的resolve,缓存到请求上,等待请求成功调用
request.reslove = resolve
// 将请求添加到待发请求数组中
reqs.push(request)
// 开始调用
runTask()
})
}
}
```

> 😭没写出来,学艺不精,面试过后仔细梳理了一下,才写出来。

0 comments on commit 6eed946

Please sign in to comment.