循环/映射从 .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 的用户数组。