这是一个真正的入门级反应式编程问题。以下代码将从github记录users
的数组。如何使用Rx访问每个人user.login
?
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)
})
答案 0 :(得分:3)
要从数组中获取每个用户,请按如下所示创建并返回该数组的新observable:
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返回一个用户数组。
答案 1 :(得分: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)
})
这样,数组中的每个元素都被投射到一个新的observable上,它们都被合并到一个observable中,这正是你想要的。