我正在尝试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;
}
})
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试提出多个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');
});
Run Code Online (Sandbox Code Playgroud)
这是我的结果.
AnonymousObservable { source: undefined, __subscribe: [Function: forEach] }
AnonymousObservable { source: undefined, __subscribe: [Function: forEach] }
Completed
Run Code Online (Sandbox Code Playgroud)
我知道我正在接受它Observable
,如果我forEach
通过它们,那么我会得到结果,但我错过了将其转换为data
而不是转换的正确方法Observable
.我究竟做错了什么?
use*_*222 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');
});
Run Code Online (Sandbox Code Playgroud)
一些解释:
Converting events or asynchronous patterns to observable sequences, or between Arrays and observable sequences.
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.md和https://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