Promise批量请求&;限制并发&;避免阻塞&;错误重连
发布人:shili8
发布时间:2025-01-09 14:29
阅读次数:0
**Promise 批量请求、限制并发、避免阻塞和错误重连**
在实际的开发中,我们经常会遇到需要批量发送请求的情况,例如:批量上传文件、批量发送短信等。在这些场景下,如果我们不采取合适的措施,可能会导致大量请求同时发出,从而引起服务器压力过大、响应时间过长甚至崩溃。因此,我们需要对 Promise 批量请求进行限制并发、避免阻塞和错误重连。
**Promise 批量请求**
首先,我们来看一下 Promise 批量请求的基本实现:
javascriptfunction batchRequest(urls) { return urls.map((url) => fetch(url)).then((responses) => Promise.all(responses) ); }
这个函数接受一个数组 `urls`,然后使用 `map()` 方法对每个 URL 发起请求,并返回一个 Promise 数组。最后,我们使用 `Promise.all()` 方法等待所有请求完成,然后返回结果。
**限制并发**
为了限制并发,我们可以使用 `Promise.all()` 的第二个参数 `options` 来控制最大并发数:
javascriptfunction batchRequest(urls, maxConcurrency =5) { return Promise.all( urls.map((url) => fetch(url)), { concurrency: maxConcurrency } ).then((responses) => Promise.all(responses) ); }
在这个例子中,我们设置了最大并发数为 `maxConcurrency`,如果没有传入该参数,则默认为 `5`。这样我们就可以控制同时发出请求的数量。
**避免阻塞**
为了避免阻塞,我们可以使用 `Promise.race()` 方法来实现:
javascriptfunction batchRequest(urls, maxConcurrency =5) { const promises = []; for (let i =0; i < urls.length; i += maxConcurrency) { const chunkUrls = urls.slice(i, i + maxConcurrency); promises.push( Promise.race(chunkUrls.map((url) => fetch(url))) ); } return Promise.all(promises).then((responses) => responses.flat() ); }
在这个例子中,我们将 URL 数组分成 `maxConcurrency` 个块,然后使用 `Promise.race()` 方法来实现并发限制。这样我们就可以避免阻塞。
**错误重连**
为了实现错误重连,我们可以使用 `retry()` 函数:
javascriptfunction retry(maxAttempts =3, delay =1000) { return (fn) => { let attempts =0; const maxDelay = delay * maxAttempts; return () => new Promise((resolve, reject) => { fn().then(resolve).catch((error) => { if (attempts < maxAttempts && Date.now() - start > maxDelay) { attempts++; setTimeout(() => resolve(retry(fn)), delay); } else { reject(error); } }); }); }; }
在这个例子中,我们定义了一个 `retry()` 函数,接受两个参数:`maxAttempts` 和 `delay`。我们使用 `Promise` 来实现重连逻辑。
**示例代码**
javascriptconst urls = [ ' /> ' /> ' />]; batchRequest(urls,5) .then((responses) => console.log(responses)) .catch((error) => console.error(error)); const retryBatchRequest = retry(3,1000); retryBatchRequest(() => fetch(' />).then((response) => console.log(response)).catch((error) => console.error(error));
在这个例子中,我们使用 `batchRequest()` 函数来实现批量请求,并限制并发数为 `5`。我们还使用 `retryBatchRequest()` 函数来实现错误重连。
**总结**
Promise 批量请求、限制并发、避免阻塞和错误重连是实际开发中常见的需求。在本文中,我们介绍了 Promise 批量请求的基本实现,并提供了示例代码。我们还使用 `Promise.all()` 的第二个参数 `options` 来控制最大并发数,使用 `Promise.race()` 方法来实现并发限制,以及使用 `retry()` 函数来实现错误重连。