当前位置:实例文章 » 其他实例» [文章]Promise批量请求&限制并发&避免阻塞&错误重连

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()` 函数来实现错误重连。

相关标签:并发
其他信息

其他资源

Top