I’m new to reactive programming and toying around with cycle.js, trying to implement who to follow box from this tutorial. But I understood that for proper implementation (and learning purposes) I don’t have one piece of data: full user name. I can get it by sequentially getting users and then full user data from server. In imperative style I would do something like this:
fetch(`https://api.github.com/users`)
  .then(data => data.json())
  .then(users => fetch(users[0].url))
  .then(data => data.json())
  .then(/* ... work with data ... */)
But how do I do it in cycle? I’m using fetch driver and trying something like this:
function main({ DOM, HTTP }) {
  const users = `https://api.github.com/users`;
  const refresh$ = DOM.select(`.refresh`).events(`click`)
  const response$ = getJSON({ key: `users` }, HTTP)
  const userUrl$ = response$
    .map(users => ({
      url: R.prop(`url`, R.head(users)),
      key: `user`,
    }))
    .startWith(null)
  const request$ = refresh$
    .startWith(`initial`)
    .map(_ => ({
      url: `${users}?since=${random(500)}`,
      key: `users`,
    }))
    .merge(userUrl$)
  const dom$ = ...
  return {
    DOM: dom$,
    HTTP: request$,
  };
}
where getJSON is
function getJSON(by, requests$) {
  const type = capitalize(firstKey(by));
  return requests$
    [`by${type}`](firstVal(by))
    .mergeAll()
    .flatMap(res => res.json());
And I’m always getting some cryptic (for me) error like: TypeError: Already read. What does it mean and how do I handle it properly?