Обратный вызов find
должен возвращать логическое значение, а не наблюдаемое.Например,
find(c => c.name === 'development')
ОБНОВЛЕНИЕ
Вот ваш модифицированный пример.Я удалил генераторы, так как они сложнее, чем требуется в нашем случае.
const { of, EMPTY, throwError } = rxjs;
const { filter, tap, expand, pluck, mergeAll } = rxjs.operators;
const DATA =
[ {channels: [{id: 123, name: 'test'}, {id:4, name: 'hello'}], cursor: 1}
, {channels:[{id: 1, name: 'world'}, {id: 2, name: 'knows'}], cursor: 2}
, {channels:[{id: 3, name: 'react'}, {id: 5, name: 'devcap'}], cursor: false}
];
function getChannel(){
return getBlock()
.pipe(
expand(x => x.cursor ? getBlock(x.cursor) : EMPTY),
pluck('channels'),
mergeAll(),
filter(c => c.name === 'devcap')
)
}
getChannel().subscribe({
next: console.log,
error: console.error
});
function getBlock(index = 0) {
if (index >= DATA.length){
throwError('Out of bounds');
}
return of(DATA[index]);
}
ОБНОВЛЕНИЕ 2
Ваше решение не работает из-за рекурсии, выполняемой черезисключительно getChannel()
.Когда вы делаете expand
- вы запускаете другой цикл через getChannel()
.Это означает, что вы запускаете pluck-mergeAll-filter
chain дважды для каждого рекурсивно извлеченного значения!Дважды потрепав и обольщая, вы получите undefined
- следовательно, ошибку.
На вашей игровой площадке - попробуйте выделить этот код
let getValue = ()=>{
const next = gen.next();
if (!next || !next.value) { return EMPTY; }
return next.value;
}
и использовать его в расширении, например, так::
let getChannel = () => {
return getValue()
.pipe(
expand(body => {
return body.cursor ? getValue() : EMPTY
}),
pluck('channels'),
mergeAll(),
filter(c => c.name === 'devcap'),
)
}