Я новичок в реактивном программировании и играю с cycle.js, пытаясь реализовать поле «Кто следовать» из этого руководства. Но я понял, что для правильной реализации (и целей обучения) у меня нет одной части данных: полного имени пользователя. Я могу получить его, последовательно получая пользователей, а затем полные пользовательские данные с сервера. В императивном стиле я бы сделал что-то вроде этого:
fetch(`https://api.github.com/users`)
.then(data => data.json())
.then(users => fetch(users[0].url))
.then(data => data.json())
.then(/* ... work with data ... */)
Но как мне сделать это в цикле? Я использую драйвер извлечения и пытаюсь сделать что-то вроде этого:
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$,
};
}
где getJSON
function getJSON(by, requests$) {
const type = capitalize(firstKey(by));
return requests$
[`by${type}`](firstVal(by))
.mergeAll()
.flatMap(res => res.json());
И я всегда получаю какую-то загадочную (для меня) ошибку, например: TypeError: Already read
. Что это значит и как правильно с этим обращаться?