-
Notifications
You must be signed in to change notification settings - Fork 140
/
Copy pathlimit.js
68 lines (60 loc) · 1.38 KB
/
limit.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// function runTask(list){
// // 挨个执行传递的异步任务
// }
function limit(maxCount){
// [,5]
// [2,34,]
let queue = []
let activeCount = 0
const next = ()=>{
//下一个任务
activeCount--
if(queue.length>0){
queue.shift()()
}
}
const run = async (fn,resolve,args)=>{
//执行一个函数
activeCount++
const result = (async()=>fn(...args))()
resolve(result)
await result
next() //下一个
}
const push = async (fn,resolve,args)=>{
queue.push(run.bind(null,fn,resolve,args))
if(activeCount<maxCount && queue.length>0){
// 队列没满 并且还有任务 启动任务
queue.shift()()
}
}
let runner = (fn,...args)=>{
return new Promise((resolve)=>{
push(fn,resolve,args)
})
}
return runner
}
async function sleep(n,name='test'){
return new Promise(resolve=>{
console.log(n,name,'start')
setTimeout(()=>{
console.log(n,name,'end','-------------')
resolve({n,name})
},n*1000)
})
}
async function start(){
let runner = limit(2) //并发量是3
let tasks = [
()=> sleep(1,'吃饭'),
()=> sleep(3,'睡觉'),
()=> sleep(5,'打游戏'),
()=> sleep(3.5,'学习算法'),
()=> sleep(4,'学习Vue和React'),
].map(runner)
let result = await Promise.all(tasks)
console.log(result,'end')
}
// @think 如果任务有优先级呢
start()