2016-02-10 35 views
1

這是一個真正的入門級響應式編程問題。以下代碼將記錄來自github的users的數組。我如何才能訪問使用Rx登錄每個人user.login從.flatMap返回的數組循環/地圖

import axios from 'axios' 
import Rx from 'rx' 

let requestStream = Rx.Observable.just('https://api.github.com/users') 

let getJSON = (url) => { 
    return axios.get(url).then(response => response.data) 
} 

let responseStream = requestStream 
    .flatMap(function(requestUrl) { 
    return Rx.Observable.fromPromise(getJSON(requestUrl)) 
    }) 

responseStream.subscribe(function(response) { 
    console.log(response) 
}) 

我已經試過:

let responseStream = requestStream 
    .flatMap(function(requestUrl) { 
    return Rx.Observable.fromPromise(getJSON(requestUrl)) 
    }) 
    .flatMap(user => { 
    console.log(user) 
    }) 

和:

let users = responseStream 
    .flatMap(user => { 
    console.log(user) 
    }) 

users.subscribe(function(response) { 
    // console.log(response) 
}) 

回答

3

從數組中獲得每個用戶,創建並返回數組的新觀察到如下:

let responseStream = requestStream 
    .flatMap(function(requestUrl) { 
    return getJSON(requestUrl); 
    }) 
    .flatMap(function(usersResponse) { 
    return rx.Observable.from(usersResponse); 
    }) 
    .doOnNext(function(user) { 
    console.log(user); 
    }); 

當你調用responseStream.subscribe(......)現在應該記錄每個用戶從.doOnNext()方法進行逐一。

我用Mosho的答案作爲這個響應的基礎,假設第一個flatMap從github返回一個用戶數組。

0

flatMap處理程序可返回的承諾,所以你不需要fromPromise

爲了得到您需要的,單獨項目的可觀察性,您可以再次使用flatMap,它完全符合您的要求。第一次嘗試幾乎是正確的,但投影(合併到一個新的返回的可觀察對象)是從flatMap處理程序返回的。

import axios from 'axios' 
import Rx from 'rx' 

let requestStream = Rx.Observable.just('https://api.github.com/users') 

let getJSON = (url) => { 
    return axios.get(url).then(response => response.data) 
} 

let responseStream = requestStream 
    .flatMap(function(requestUrl) { 
    return getJSON(requestUrl); 
    }) 
    .flatMap(function(x) { 
     return x; 
    }); 

responseStream.subscribe(function(response) { 
    console.log(response) 
}) 

這樣,陣列中的每個元素投影到一個新的觀察到的,並且它們都合併爲一個可觀察的,這是你想要什麼。

+0

第二個'flatMap'仍然返回整個'users'對象而不是個人'user'。 – ThomasReggi