Promise.all 控制并发

问题:当使用Promise.all并发请求时,所有请求会同时发出。因为在创建p1,p2,p3的时候就会执行。

Primise.all([p1, p2, p3]).then((res) => ...)

解决:使用Promise.race配合 async await解决
当达到并发限制时,通过Promise.race 完成一个请求再添加下一个请求,以达到限制并发要求。

/**
 * @description 控制promise.all并发数量
 * @param limit 并发数
 * @param array 参数列表
 * @param apiFn 执行函数
 * @returns {Promise[]>}
 */
async function promiseAllLimit(limit, array, apiFn) {
	const ret = [] // 用于存放所有的promise实例
	const executing = [] // 用于存放目前正在执行的promise
	for (const item of array) {
		const p = apiFn(item)
		ret.push(p)
		if (limit <= array.length) {
			// then回调中,当这个promise状态变为fulfilled后,将其从正在执行的promise列表executing中删除
			const e = p.then(() => executing.splice(executing.indexOf(e), 1))
			executing.push(e)
			if (executing.length >= limit) {
				// 一旦正在执行的promise列表数量等于限制数,就使用Promise.race等待某一个promise状态发生变更,
				// 状态变更后,就会执行上面then的回调,将该promise从executing中删除,
				// 然后再进入到下一次for循环,生成新的promise进行补充
				await Promise.race(executing)
			}
		}
	}
	return Promise.all(ret)
}

promiseAllLimit(3, paramsArr, apiFn).then((res) => {
	console.log('Promise.all 结果',res)
}

你可能感兴趣的:(笔记,javascript,前端,typescript)