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

时间:2015-11-01 05:36:35

标签: javascript rxjs

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

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通过它们,那么我会得到结果,但我错过了将其转换为{{1}的正确方法而不是data。我做错了什么?

1 个答案:

答案 0 :(得分:11)

应该这样做:

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运算符生成一系列promise,但实际上你会使用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/core/operators/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