相关疑难解决方法(0)

使用RxJS限制一次请求数

假设我有10个网址,我希望为每个网址发出HTTP请求.

我可以创建一个可观察的URL,然后.flatMap()是每个URL 的请求,然后.subscribe是结果.但这会立即产生所有要求.

有没有办法对固定数量的请求数量施加限制,以免使服务器过载

javascript rxjs

8
推荐指数
3
解决办法
5027
查看次数

使用RxJS进行批处理?

我猜这应该有点容易实现,但我遇到了麻烦(从概念上讲,我猜)找出如何解决它.

我所拥有的是一个返回JSON对象数组的API.我需要逐步浏览这些对象,并为每个对象进行另一个AJAX调用.问题是处理每个AJAX调用的系统一次只能处理两个活动调用(因为它是一个CPU密集型任务,可以挂钩到桌面应用程序中).

我想知道如何使用RxJS(使用版本5或4)来实现这一目标?

编辑:此外,是否可以同时运行一系列步骤.即

Downloading File: 1 Processing File: 1 Converting File: 1 Uploading File: 1 Downloading File: 2 Processing File: 2 Converting File: 2 Uploading File: 2 Downloading File: 3 Processing File: 3 Converting File: 3 Uploading File: 3

我尝试过这样的事情:

Rx.Observable.fromPromise(start())
    .concatMap(arr => Rx.Observable.from(arr))
    .concatMap(x => downloadFile(x))
    .concatMap((entry) => processFile(entry))
    .concatMap((entry) => convertFile(entry))
    .concatMap((entry) => UploadFile(entry))
    .subscribe(
        data => console.log('data', new Date().getTime(), data),
        error => logger.warn('err', error),
        complete => logger.info('complete')
    );
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不起作用.例如,downloadFile不等待processFile,convertFile和uploadFile全部完成,而是下一个将在前一个完成后再次运行.

javascript rxjs rxjs5

5
推荐指数
1
解决办法
1733
查看次数

有没有办法用 RxJS 管理并发?

TL;DR - 我正在寻找一种方法来控制 HTTP 请求并发连接到 REST API 的数量,同时我使用 RxJS。

我的 Node.js 应用程序将向第三方提供商发出几千次 REST API 调用。但是,我知道如果我一次发出所有这些请求,服务可能会因为 DDoS 攻击而关闭或拒绝我的请求。所以,我想在任何给定时间设置最大并发连接数。我曾经通过利用Throat Package使用 Promises 实现并发控制,但我还没有找到类似的方法来实现这一点。

我尝试merge按照这篇文章中的建议使用with 1 进行并发如何限制 flatMap 的并发?,但所有请求都是一次性发送的。

这是我的代码:

var Rx = require('rx'),
  rp = require('request-promise');

var array = ['https://httpbin.org/ip', 'https://httpbin.org/user-agent',
  'https://httpbin.org/delay/3',
  'https://httpbin.org/delay/3',
  'https://httpbin.org/delay/3'
];

var source = Rx.Observable.fromArray(array).map(httpGet).merge(1);

function httpGet(url) {
  return rp.get(url);
}

var results = [];
var subscription = source.subscribe(
  function (x) {
    console.log('=====', x, '======');
  },
  function (err) {
    console.log('Error: ' + err); …
Run Code Online (Sandbox Code Playgroud)

node.js rxjs

5
推荐指数
2
解决办法
5773
查看次数

使用Rx和SelectMany限制并发请求

我有一个我想要同时下载的页面的URL列表HttpClient.URL列表可能很大(100或更多!)

我目前有这个代码:

var urls = new List<string>
            {
                @"http:\\www.amazon.com",
                @"http:\\www.bing.com",
                @"http:\\www.facebook.com",
                @"http:\\www.twitter.com",
                @"http:\\www.google.com"
            };

var client = new HttpClient();

var contents = urls
    .ToObservable()
    .SelectMany(uri => client.GetStringAsync(new Uri(uri, UriKind.Absolute)));

contents.Subscribe(Console.WriteLine);
Run Code Online (Sandbox Code Playgroud)

问题是:由于使用的原因SelectMany,几乎同时创建了大量的任务.似乎如果URL列表足够大,很多任务会给出超时(我得到"任务被取消"例外).

所以,我认为应该有一种方法,可能使用某种调度程序,来限制并发任务的数量,在给定时间不允许超过5或6.

通过这种方式,我可以获得并发下载而无需启动太多可能会失速的任务,就像他们现在所做的那样.

如何做到这一点,我不会因为大量的超时任务而饱和?

十分感谢.

.net c# concurrency reactive-programming system.reactive

3
推荐指数
1
解决办法
1063
查看次数