繁体   English   中英

如何使用rx.js发送多个http请求?

[英]How do I send multiple http requests with rx.js?

我正在尝试rx.js ,我正在尝试发出多个http请求。 这是我设置为发出http请求的observable

function httpGet(url) {
    return Observable.create(function forEach(observer) {
        var cancelled = false;
        axios.get(url).then(function(res) {
            if(!cancelled) {
                observer.onNext(res);
                observer.onCompleted();             
            }
        });

        return function dispose() {
            cancelled = true;
        }
    })
}

我正在尝试发出多个http请求,但我的结果是更多的Observable 这是subscribe

var array = ['http://localhost:4444/text/88', 'http://localhost:4444/other/77'];

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

var subscription = source.subscribe(
    function (x) {
        console.log(x);
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
});

这是我的结果。

AnonymousObservable { source: undefined, __subscribe: [Function: forEach] }
AnonymousObservable { source: undefined, __subscribe: [Function: forEach] }
Completed

我知道我正在获得Observable ,如果我forEach通过它们,那么我会得到结果,但我错过了将其转换为data而不是Observable的正确方法。 我究竟做错了什么?

这应该够了吧:

var array = ['http://localhost:4444/text/88', 'http://localhost:4444/other/77'];

var source = Rx.Observable.fromArray(array).concatMap(httpGet);

function httpGet(url) {
  return axios.get(url);
  }
var subscription = source.subscribe(
    function (x) {
        console.log(x);
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
});

一些解释:

  • 可观察的是一系列价值观。 观察者是一个处理这些值的三管齐下的对象。
  • 你想要的是将数组(源)转换为html序列(从获取URL获得)。 您拥有的是:
  • 然后,您想订阅生成的序列并使用它们执行某些操作。 这是您定义观察者的subscribe函数。
  • 所以在这里你得到你的数组值序列,用map运算符产生一系列promises,但实际上你将使用concatMap运算符以与数组值相同的顺序输出promise promise值。 concatMap可以将一个observable,一个数组/可迭代或一个promise作为其参数,并将输出包含在它返回的observable中的那些对象的值序列。 因此,您没有一系列的承诺,而是通过承诺(即您获取的html内容)解决了一系列值。 如果您对保持源的初始排序不感兴趣,还可以使用flatMap运算符。 参看 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/concatmap.mdhttps://github.com/Reactive-Extensions/RxJS/blob/master/doc/ API /型芯/运营商/ selectmany.md
  • 然后你订阅它,并处理这些值

因此,这基本上是一般过程,您采用源序列,通过明智地选择运算符将其转换为您选择的序列,然后使用您的观察函数逐个处理这些值。 另外,请注意,promise类似于observable,并且一些(大多数?) Rxjs运算符会将它们视为这样,因此您通常不必使用then来获取已解析的值。

最后, Rx.Observable.fromArray似乎不赞成使用Rx.Observable.from :cf。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromarray.md

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM