gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:02:15 25 4
gpt4 key购买 nike

我正在试用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com