从.flatMap返回的数组循环/映射

时间:2016-02-10 17:36:07

标签: javascript rxjs

这是一个真正的入门级反应式编程问题。以下代码将从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)
})

2 个答案:

答案 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中,这正是你想要的。