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

标签 javascript rxjs

我正在试用 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。这是订阅:

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 运算符生成一系列 promise,但实际上您将使用 concatMap 运算符输出已解决的 promise值的顺序与数组值相同。 concatMap 可以将一个可观察对象、一个数组/可迭代对象或一个 promise 作为其参数,并将在它返回的可观察对象中输出包装到这些对象中的值序列。因此,您没有一系列 promise ,而是拥有一系列由 promise 解决的值,即您获取的 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 来得到解决的值(value)。

最后,Rx.Observable.fromArray 似乎已被弃用,取而代之的是 Rx.Observable.from:cf。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromarray.md

关于javascript - 如何使用 rx.js 发送多个 http 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33459542/

相关文章:

rxjs - 将 WithLatestFrom 的值传递给另一个运算符 - Rxjs、Ngrx 效果

javascript - YouTube API : How to grab video ID? JQuery/Json

javascript - 事件跟踪中的自定义变量,谷歌分析

javascript - RxJS:在另一个订阅后明显中断

javascript - 使用 RxJS 捕获一组击键

RxJS:字符串数组的 SwitchMap

angular - BaseRouterStoreState 缺少类型 'ActionReducerMap<State, Action>' 的属性

Javascript - 如何创建函数的新实例

javascript - 使 svg 元素位于顶部

Javascript:如何使用正则表达式从字符串中提取多个值?