// 回調(diào)
asyncFun = (arg, cb) => {
setTimeout(()=>{
console.log(`參數(shù)為${arg}`)
cb(arg * 2)
},1000)
}
let items = [1,2,3,4,5,6]
var cbResults = []
final = (result) => {
console.log(`完成${result}`)
}
串行執(zhí)行任務(wù)隊列items
series = (item) => {
if (item) {
asyncFun(item, (cbParams) => {
cbResults.push(cbParams)
return series(items.shift())
})
} else {
final(cbResults)
console.timeEnd('sync')
}
}
console.time('sync');
series(items.shift()) //6.012s
并行執(zhí)行任務(wù)隊列items
let len = items.length
console.time('asyncFn');
items.forEach((item) => {
asyncFun(item, (cbParams) => {
cbResults.push(cbParams)
if (cbResults.length == len) {
final(cbResults)
console.timeEnd('asyncFn');
}
})
})
// 1.003s
串行與并行的結(jié)合,即每次設(shè)定最多能并行n個異步任務(wù)
let running = 0 //串行的任務(wù)個數(shù)
let limit = 2 // 最多能并行2個異步任務(wù)(每兩個一輸出)
console.time('control')
launcher = () => {
while(running < limit && items.length > 0) {
let item = items.shift()
running++
asyncFun(item, (cbParams) => {
cbResults.push(cbParams)
running--
if (items.length > 0) {
launcher()
}else if(running == 0){
final(cbResults);
console.timeEnd('control');
}
})
}
}
launcher();
// 3.005s
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者