JavaScript 中可以通过 Promise.all()、Promise.race()、async/await 等不同方式来实现对异步并发任务的控制 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 1 、Promise.all() const urls = ["url1" , "url2" , ... ,"url100" ]; const maxConcurrentNum = 10 ; function chunk (arr, chunk) { let result = []; for (let i = 0 , len = arr.length; i < len; i += chunk) { result.push(arr.slice(i, i + chunk)); } return result; } function fetchUrl (url) { return new Promise((resolve, reject) => { fetch(url) .then(res => resolve(res)) .catch (err => reject(err)); }); } const chunkedUrls = chunk(urls, maxConcurrentNum); (async function () { try { for (let urls of chunkedUrls) { const promises = urls.map(url => fetchUrl(url)); const results = await Promise.all(promises); console.log('results:' , results); } } catch (err) { console.error(err); } })(); ###以上代码通过将数组分成多个数目相等的小数组,每次最多只开启maxConcurrentNum个并发请求,以此来控制并发数量。每当一组请求完成后再发送新的一批请求,可以实现对异步任务的并发控制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 、Promise .race () const promiselist = []; for (let i = 0 ; i < 100 ; i++) { const promise = fetch (`https://example.com/data${i} .json` ); promiselist.push (promise); } Promise .race (promiselist) .then (response => { }) .catch (error => { console .error (error); });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 3 、async /await async function getData () { const promiselist = []; for (let i = 0 ; i < 100 ; i++) { const promise = fetch(`https: promiselist.push(promise); } const responses = await Promise.all(promiselist); for (const response of responses) { } } getData().catch (error => { console.error(error); }); ###在上面的代码中,我们首先创建了一个async函数,并在该函数中使用for循环来发送所有的请求,并将每个请求的Promise对象存储在一个数组中。 然后,我们使用await关键字来异步等待所有Promise对象都被解决,并将解决值存储在一个数组中。 最后,我们在处理每个响应时对数组进行迭代。
4、 还有一些第三方库可以使用,例如 async.js 和 p-limit 等。p-limit 是一个专门用于控制 Promise 并发的小型库。可以在 p-limit 文档中找到更多信息和示例。