Multiple observables inside observable in Angular/NGRX and merge results at the end










0















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?










share|improve this question






















  • 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
















0















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?










share|improve this question






















  • 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














0












0








0








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?










share|improve this question














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






share|improve this question













share|improve this question











share|improve this question




share|improve this question










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


















  • 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













1 Answer
1






active

oldest

votes


















0














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.






share|improve this answer






















    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
    );



    );













    draft saved

    draft discarded


















    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









    0














    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.






    share|improve this answer



























      0














      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.






      share|improve this answer

























        0












        0








        0







        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.






        share|improve this answer













        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.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 13 '18 at 23:50









        AlesDAlesD

        2,60839




        2,60839



























            draft saved

            draft discarded
















































            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.




            draft saved


            draft discarded














            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





















































            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







            這個網誌中的熱門文章

            Barbados

            How to read a connectionString WITH PROVIDER in .NET Core?

            Node.js Script on GitHub Pages or Amazon S3