Eu tenho um riched_sns$ observável que estou enriquecendo executando operações em cada item emitido usando concatMap e, em seguida, combinando os resultados em uma matriz usando toArray(). No entanto, estou curioso para saber se existe uma abordagem alternativa para obter o mesmo resultado sem usar toArray().
Aqui está meu código atual:
private enriched_sns$ = toObservable(this.sn_results).pipe(
concatMap((results) => results as StreamNotificationResult[]),
concatMap((notification) => {
const user_id = notification.activities[0].actor.id;
return zip(of(notification), this.read_user_data_service.readUserData(user_id));
}),
map(([notification, user]) => {
return {
notification,
user: user,
};
}),
toArray(),
);
Existe uma maneira de obter uma matriz de itens emitidos no final do observável sem recorrer a toArray()? Qualquer ajuda ou abordagens alternativas seriam muito apreciadas. Obrigado!
O motivo pelo qual você precisa usar
toArray()
no seu exemplo é porque você está pegando o array emitido do seu sinal e depois emitindo cada elemento individualmente.Você poderia usar a
forkJoin
função para lidar com a assinatura de uma matriz de observáveis, em vez deconcatMap
emitir cada elemento, um de cada vez:Há uma diferença importante:
forkJoin
subscrever todos os observáveis ao mesmo tempo, e não um de cada vez. Se você precisar limitar a simultaneidade, você pode verificar orxjs-etc
pacote que possui umaforkJoinConcurrent
função que permite especificar a simultaneidade:Observe que o uso de
zip
/of
não é necessário. Você pode simplesmente adicionar um.pipe
ao seu observável interno e mapear a emissão para a forma desejada: