如果 100 个请求,你怎么用 Observable 去控制并发?

如果你想在发起100个请求时使用Observable来控制并发,可以使用RxJS的`mergeMap`操作符和`Subject`来实现。以下是一个可能的实现:


import { Subject } from 'rxjs';
import { mergeMap } from 'rxjs/operators';

const urls = [/* 100个url */];
const maxConcurrency = 5; // 最多同时发送的请求数量

const requestSubject = new Subject(); // 用于存储待发送的请求

function fetchData(url) {
  // 发送请求的异步函数
  return fetch(url).then(response => response.json());
}

requestSubject
  .pipe(
    mergeMap(url => fetchData(url), maxConcurrency) // 使用mergeMap控制并发数量
  )
  .subscribe(
    data => {
      // 请求成功后的处理
    },
    error => {
      // 请求失败后的处理
    },
    () => {
      // 所有请求完成后的处理
    }
  );

// 发送所有请求
for (const url of urls) {
  requestSubject.next(url);
}
requestSubject.complete();

在上述代码中,我们首先定义了一个包含100个URL的数组,并且定义了最多同时发送5个请求的变量。然后我们创建了一个`Subject`对象`requestSubject`,用于存储待发送的请求。

接下来,我们定义了一个异步函数`fetchData`,用于发送单个请求并返回响应的JSON数据。接着,我们使用`mergeMap`操作符将`requestSubject`中的每个请求转换为一个Observable,然后使用`maxConcurrency`参数控制最多同时发送的请求数量。最后,我们使用`subscribe`方法来订阅这个Observable,处理请求的结果。

在主程序中,我们遍历所有URL,并使用`requestSubject.next(url)`方法将每个URL添加到`requestSubject`中。最后,我们使用`requestSubject.complete()`方法通知`requestSubject`已经完成了所有请求。

请注意,在此示例中,我们使用了RxJS库中的`Subject`和`mergeMap`操作符,需要在支持该库的JavaScript环境中运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值