2015-11-01 46 views
3

我正在嘗試rx.js,我試圖提出多個http請求。這裏是我設置的observable以提出http請求。如何使用rx.js發送多個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版通過他們,然後我會得到的結果,但我的思念轉化成data而不是Observable這個的正確方法。我究竟做錯了什麼?

回答

10

這應該做的伎倆:

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運算符產生一系列的承諾,但實際上你會用concatMap運算符以與數組值相同的次序輸出承諾解決的值。 concatMap可以將可觀察,數組/迭代或承諾作爲其參數,並將輸出包裝到它返回的可觀察對象中的值序列。因此,不是有一系列的承諾,而是由承諾解決的一系列值,即您獲取的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
  • 那麼您訂閱的,並處理這些值

所以這基本上是一般的過程中,你需要一個源序列,將其轉換成您所選擇的序列通過運營商的明智選擇,然後用觀察者函數逐個處理這些值。 此外,請注意承諾類似於可觀察的,並且一些(大多數?)Rxjs運營商將這樣對待它們,所以您通常不必使用then來獲得解析值。

最後一件事情,Rx.Observable.fromArray似乎已被廢棄,以支持Rx.Observable.from:cf. https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromarray.md