Multiple observables inside observable in Angular/NGRX and merge results at the end
I am using NGRX with angular 6. In my component, I make a call to a selector which returns a list of objects.For example,
list$: Observable<any>;
this.list$ = this.store$.select(getPreviousById(Id));
Currently, I bind the returned list to my html using the |async and it works nicely. I have a new requirement where some items in the list are keys that I need to make another API call to get the full details for each of them. I'm not sure how to do this, and still retain the binding on the HTML cleanly.
Do I have to process the initial returned observable and then extract this keys, dispatch an action to the store and merge the results back to the initial list?
What is the way for calling several observables within an observable and only marking it as complete when all the child observables have returned, all in NGRX?
angular ngrx ngrx-store ngrx-effects
add a comment |
I am using NGRX with angular 6. In my component, I make a call to a selector which returns a list of objects.For example,
list$: Observable<any>;
this.list$ = this.store$.select(getPreviousById(Id));
Currently, I bind the returned list to my html using the |async and it works nicely. I have a new requirement where some items in the list are keys that I need to make another API call to get the full details for each of them. I'm not sure how to do this, and still retain the binding on the HTML cleanly.
Do I have to process the initial returned observable and then extract this keys, dispatch an action to the store and merge the results back to the initial list?
What is the way for calling several observables within an observable and only marking it as complete when all the child observables have returned, all in NGRX?
angular ngrx ngrx-store ngrx-effects
You can use concat in switchMap when you received the list from a service learnrxjs.io/operators/transformation/switchmap.html learnrxjs.io/operators/combination/concat.html
– Gilsdav
Nov 13 '18 at 23:03
add a comment |
I am using NGRX with angular 6. In my component, I make a call to a selector which returns a list of objects.For example,
list$: Observable<any>;
this.list$ = this.store$.select(getPreviousById(Id));
Currently, I bind the returned list to my html using the |async and it works nicely. I have a new requirement where some items in the list are keys that I need to make another API call to get the full details for each of them. I'm not sure how to do this, and still retain the binding on the HTML cleanly.
Do I have to process the initial returned observable and then extract this keys, dispatch an action to the store and merge the results back to the initial list?
What is the way for calling several observables within an observable and only marking it as complete when all the child observables have returned, all in NGRX?
angular ngrx ngrx-store ngrx-effects
I am using NGRX with angular 6. In my component, I make a call to a selector which returns a list of objects.For example,
list$: Observable<any>;
this.list$ = this.store$.select(getPreviousById(Id));
Currently, I bind the returned list to my html using the |async and it works nicely. I have a new requirement where some items in the list are keys that I need to make another API call to get the full details for each of them. I'm not sure how to do this, and still retain the binding on the HTML cleanly.
Do I have to process the initial returned observable and then extract this keys, dispatch an action to the store and merge the results back to the initial list?
What is the way for calling several observables within an observable and only marking it as complete when all the child observables have returned, all in NGRX?
angular ngrx ngrx-store ngrx-effects
angular ngrx ngrx-store ngrx-effects
asked Nov 13 '18 at 22:21
james Makindejames Makinde
2531616
2531616
You can use concat in switchMap when you received the list from a service learnrxjs.io/operators/transformation/switchmap.html learnrxjs.io/operators/combination/concat.html
– Gilsdav
Nov 13 '18 at 23:03
add a comment |
You can use concat in switchMap when you received the list from a service learnrxjs.io/operators/transformation/switchmap.html learnrxjs.io/operators/combination/concat.html
– Gilsdav
Nov 13 '18 at 23:03
You can use concat in switchMap when you received the list from a service learnrxjs.io/operators/transformation/switchmap.html learnrxjs.io/operators/combination/concat.html
– Gilsdav
Nov 13 '18 at 23:03
You can use concat in switchMap when you received the list from a service learnrxjs.io/operators/transformation/switchmap.html learnrxjs.io/operators/combination/concat.html
– Gilsdav
Nov 13 '18 at 23:03
add a comment |
1 Answer
1
active
oldest
votes
You can use the flatMap operator to do that. With this operator you map every item to an Observable and then they get merged back together so in the end you have a single observable with all the items. Here is a simple example:
const items: Observable<Item | number> = of(new Item(1, 'Name1'), 3, 4, new Item(1, 'Name2'));
const outputItems: Observable<Item> = items.pipe(
mergeMap((x: Item | number) =>
if (typeof x === 'number') // it is a key call service
return of(new Item(x, `Name$x`)); // here you call the service to get the item
else
return of(x); //return observable directly from item
)
);
Use the concatMap operator if you want to preserve the order of items.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53290402%2fmultiple-observables-inside-observable-in-angular-ngrx-and-merge-results-at-the%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can use the flatMap operator to do that. With this operator you map every item to an Observable and then they get merged back together so in the end you have a single observable with all the items. Here is a simple example:
const items: Observable<Item | number> = of(new Item(1, 'Name1'), 3, 4, new Item(1, 'Name2'));
const outputItems: Observable<Item> = items.pipe(
mergeMap((x: Item | number) =>
if (typeof x === 'number') // it is a key call service
return of(new Item(x, `Name$x`)); // here you call the service to get the item
else
return of(x); //return observable directly from item
)
);
Use the concatMap operator if you want to preserve the order of items.
add a comment |
You can use the flatMap operator to do that. With this operator you map every item to an Observable and then they get merged back together so in the end you have a single observable with all the items. Here is a simple example:
const items: Observable<Item | number> = of(new Item(1, 'Name1'), 3, 4, new Item(1, 'Name2'));
const outputItems: Observable<Item> = items.pipe(
mergeMap((x: Item | number) =>
if (typeof x === 'number') // it is a key call service
return of(new Item(x, `Name$x`)); // here you call the service to get the item
else
return of(x); //return observable directly from item
)
);
Use the concatMap operator if you want to preserve the order of items.
add a comment |
You can use the flatMap operator to do that. With this operator you map every item to an Observable and then they get merged back together so in the end you have a single observable with all the items. Here is a simple example:
const items: Observable<Item | number> = of(new Item(1, 'Name1'), 3, 4, new Item(1, 'Name2'));
const outputItems: Observable<Item> = items.pipe(
mergeMap((x: Item | number) =>
if (typeof x === 'number') // it is a key call service
return of(new Item(x, `Name$x`)); // here you call the service to get the item
else
return of(x); //return observable directly from item
)
);
Use the concatMap operator if you want to preserve the order of items.
You can use the flatMap operator to do that. With this operator you map every item to an Observable and then they get merged back together so in the end you have a single observable with all the items. Here is a simple example:
const items: Observable<Item | number> = of(new Item(1, 'Name1'), 3, 4, new Item(1, 'Name2'));
const outputItems: Observable<Item> = items.pipe(
mergeMap((x: Item | number) =>
if (typeof x === 'number') // it is a key call service
return of(new Item(x, `Name$x`)); // here you call the service to get the item
else
return of(x); //return observable directly from item
)
);
Use the concatMap operator if you want to preserve the order of items.
answered Nov 13 '18 at 23:50
AlesDAlesD
2,60839
2,60839
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53290402%2fmultiple-observables-inside-observable-in-angular-ngrx-and-merge-results-at-the%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
You can use concat in switchMap when you received the list from a service learnrxjs.io/operators/transformation/switchmap.html learnrxjs.io/operators/combination/concat.html
– Gilsdav
Nov 13 '18 at 23:03