我正在尝试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
。我做错了什么?
答案 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');
});
一些解释:
Converting events or asynchronous patterns to observable sequences, or between Arrays and observable sequences.
部分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.md和https://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