Puede que se de el caso de que halles algún problema con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.
Solución:
Algo así podría funcionar
getUsers()
.pipe(
switchMap(users => from(users)),
mergeMap(user => forkJoin(getAddresses(user.id), getCompanies(user.id))
.pipe(map(data => (user, addresses: data[0], companies: data[1] )))
tap(data => data.user.addresses = data.addresses),
tap(data => data.user.companies = data.companies),
map(data => data.user),
toArray()
)
)
Aplicado a un caso de uso diferente, una cadena similar se explica con más detalles aquí.
Para encadenar observables, puedes usar el flatMap
función. Esta función es como promesas entonces, lo que significa que la función solo se ejecuta una vez que el observable se ha resuelto en un valor.
También hay una función observable llamada forkJoin
lo que le permite esperar a que varias solicitudes asíncronas se hayan resuelto en un valor.
Ejemplo:
getUsers().flatMap((users) =>
// the users variable is the list of users
var multipleObservables = [];
users.forEach((u) =>
multipleObservables.push(
getUserAddresses(u.id).map((usersAddresses) =>
u.addresses = usersAddresses;
return u;
);
);
);
return forkJoin(multipleObservables);
).flatMap((usersWithAddresses) =>
// the usersWithAddresses variable is an array of users which also have their addresses
var multipleObservables = [];
usersWithAddresses.forEach((u) =>
multipleObservables.push(
getUserCompanies(u.id).map((usersCompanies) =>
u.companies = usersCompanies;
return u;
);
);
);
return forkJoin(multipleObservables);
);
Puede escribir algo como esto para encadenar su solicitud y hacer crecer sus objetos de usuario.
Comentarios y puntuaciones del tutorial
Si sostienes alguna sospecha y disposición de refinar nuestro escrito te proponemos dejar una crónica y con mucho placer lo ojearemos.