Я хочу создать наблюдаемое из дерева.Каждый узел будет генерировать наблюдаемую, которая зависит от наблюдаемой его родителя (например, через switchMap
).На каждом уровне дерева необходимо объединить наблюдаемые для каждого потомка.
Я хочу преобразовать этот код так, чтобы он использовал наблюдаемые:
interface Request {
name: string;
childrens?: Request[];
}
start() {
this.nextRequests(this.requests);
}
private nextRequests(requests: Requests[]) {
requests.forEach(request => {
this.socketService.message(request.name, (res) => {
if (request.childrens) {
this.nextRequests(request.childrens, res);
}
});
});
}
Так вот, что я думалэто будет выглядеть так:
interface Request {
name: string;
childrens?: Request[];
}
// This isn't right.
// SocketService.message return a observable, the reponse of the request.
start(requests: Request[]): Observable<any> {
return from(requests).pipe(switchMap(request => {
return this.socketService.message(request.name);
}), concatMap(request => {
if (request.childrens) {
return this.start(request.childrens);
}
return of(request.name);
}));
}
const mock: Request[] = [
{name: 'test1', childrens: [
{ name: 'test4' },
{ name: 'test5' }
]},
{ name: 'test2' },
{ name: 'test3' }
];
this.start(mock).subscribe((name) => {
console.log(`Request ${name} done`);
}, err => { }, () => {
console.log('Complete');
});
И вывод будет выглядеть так:
Request test1 done
Request test2 done
Request test3 done
Request test4 done
Request test5 done
Complete
Но вместо этого я получаю это:
Request test2 done
Request test3 done
Request test4 done
Request test5 done
Порядокэмиссия между узлами братьев и сестер не важна.Но родители с детьми не печатаются (test1
), и полный обратный вызов никогда не выполняется.Почему это так?
Спасибо!