搞个大函数处理异步问题

function concurrencyRequest () {
    const tasks = []
    const result = []
    let idx = 0,count = 0

    function _start (limit) {
        return new Promise(resolve => {
            async function _handler () {
                if(tasks.length === 0) {
                    resolve([])
                    return 
                }
                const i = idx
                idx++
                const res = await tasks[i]
                result[i] = res
                count++
                
                if(idx < tasks.length) {
                    _handler()
                }                
                if(count === tasks.length) {
                    resolve(result)
                }
            }
            const len = Math.min(tasks.length, limit)
            for(let i = 0 ; i < len; i ++) {
                _handler()
            }    
        })
    }

    function _addTasks (arg) {
        const isPromise = arg instanceof Promise 
        if(isPromise) {
            tasks.push(arg)
            return _addTasks
        } else {
            return _start(arg)
        }
    }
    return _addTasks
}

const request1 = new Promise(resolve => {
    setTimeout(() => {
        resolve(2)
    }, 100);
})
const request2 = new Promise(resolve => {
    setTimeout(() => {
        resolve(4)
    }, 20000);
})

const request3 = new Promise(resolve => {
    setTimeout(() => {
        resolve(1)
    }, 50);
})

const request4 = new Promise(resolve => {
    setTimeout(() => {
        resolve(8)
    }, 3 * 1000);
})

const requestt = concurrencyRequest()

requestt(request1)
requestt(request2)
requestt(request3)
requestt(request4)

requestt(3).then(res => {
    console.log(res);
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值