循环/映射从 .flatMap 返回的数组
Loop / map over array returned from .flatMap
这是一个真正入门级的响应式编程问题。以下代码将从 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)
})
flatMap
处理程序可以 return 承诺,因此您不需要 fromPromise
.
要获得您需要的,单独项目的可观察值,您可以再次使用 flatMap
,它完全符合您的要求。您几乎在第一次尝试时就成功了,但是投影(合并到一个新的 returned 可观察对象)是 return 从 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 中,这正是您想要的。
要从数组中获取每个用户,请按如下方式创建并return该数组的新可观察对象:
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 return 是来自 github 的用户数组。
这是一个真正入门级的响应式编程问题。以下代码将从 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)
})
flatMap
处理程序可以 return 承诺,因此您不需要 fromPromise
.
要获得您需要的,单独项目的可观察值,您可以再次使用 flatMap
,它完全符合您的要求。您几乎在第一次尝试时就成功了,但是投影(合并到一个新的 returned 可观察对象)是 return 从 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 中,这正是您想要的。
要从数组中获取每个用户,请按如下方式创建并return该数组的新可观察对象:
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 return 是来自 github 的用户数组。