Return value from multiple observable calls in a function










0















I have a function that is currently working. When calling this function, it will set a value in the component. (user.userImage)



getLoggedInUserPhoto() 
this.adalService.acquireToken('https://graph.microsoft.com')
.subscribe(token =>
let header = new HttpHeaders().set('Authorization', 'Bearer ' + token).set('Content-Type', 'image/jpeg');
this.imageService.getImage('https://graph.microsoft.com/v1.0/me/photo/$value', header)
.subscribe(blob =>
this.imageService.getImageUrlFromBlob(blob)
.then(res =>
this.user.userImage = res;
)
)
);



I am trying to do the same thing with a new function, except I want the function to return the value instead of setting a value in the component. I have searched all over and most likely I am using the wrong search terms. However, here is a pass at what I am trying to achieve



getPhoto(email: string): string 
return this.adalService.acquireToken('https://graph.microsoft.com')
.subscribe(token =>
let header = new HttpHeaders().set('Authorization', 'Bearer ' + token).set('Content-Type', 'image/jpeg');
this.imageService.getImage('https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header)
.subscribe(blob =>
this.imageService.getImageUrlFromBlob(blob)
.then(res =>
return res;
)
)
);










share|improve this question

















  • 1





    If you need token for each Http request (or conditionally) you must consider HttpInterceptor

    – User3250
    Nov 16 '18 at 3:04















0















I have a function that is currently working. When calling this function, it will set a value in the component. (user.userImage)



getLoggedInUserPhoto() 
this.adalService.acquireToken('https://graph.microsoft.com')
.subscribe(token =>
let header = new HttpHeaders().set('Authorization', 'Bearer ' + token).set('Content-Type', 'image/jpeg');
this.imageService.getImage('https://graph.microsoft.com/v1.0/me/photo/$value', header)
.subscribe(blob =>
this.imageService.getImageUrlFromBlob(blob)
.then(res =>
this.user.userImage = res;
)
)
);



I am trying to do the same thing with a new function, except I want the function to return the value instead of setting a value in the component. I have searched all over and most likely I am using the wrong search terms. However, here is a pass at what I am trying to achieve



getPhoto(email: string): string 
return this.adalService.acquireToken('https://graph.microsoft.com')
.subscribe(token =>
let header = new HttpHeaders().set('Authorization', 'Bearer ' + token).set('Content-Type', 'image/jpeg');
this.imageService.getImage('https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header)
.subscribe(blob =>
this.imageService.getImageUrlFromBlob(blob)
.then(res =>
return res;
)
)
);










share|improve this question

















  • 1





    If you need token for each Http request (or conditionally) you must consider HttpInterceptor

    – User3250
    Nov 16 '18 at 3:04













0












0








0








I have a function that is currently working. When calling this function, it will set a value in the component. (user.userImage)



getLoggedInUserPhoto() 
this.adalService.acquireToken('https://graph.microsoft.com')
.subscribe(token =>
let header = new HttpHeaders().set('Authorization', 'Bearer ' + token).set('Content-Type', 'image/jpeg');
this.imageService.getImage('https://graph.microsoft.com/v1.0/me/photo/$value', header)
.subscribe(blob =>
this.imageService.getImageUrlFromBlob(blob)
.then(res =>
this.user.userImage = res;
)
)
);



I am trying to do the same thing with a new function, except I want the function to return the value instead of setting a value in the component. I have searched all over and most likely I am using the wrong search terms. However, here is a pass at what I am trying to achieve



getPhoto(email: string): string 
return this.adalService.acquireToken('https://graph.microsoft.com')
.subscribe(token =>
let header = new HttpHeaders().set('Authorization', 'Bearer ' + token).set('Content-Type', 'image/jpeg');
this.imageService.getImage('https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header)
.subscribe(blob =>
this.imageService.getImageUrlFromBlob(blob)
.then(res =>
return res;
)
)
);










share|improve this question














I have a function that is currently working. When calling this function, it will set a value in the component. (user.userImage)



getLoggedInUserPhoto() 
this.adalService.acquireToken('https://graph.microsoft.com')
.subscribe(token =>
let header = new HttpHeaders().set('Authorization', 'Bearer ' + token).set('Content-Type', 'image/jpeg');
this.imageService.getImage('https://graph.microsoft.com/v1.0/me/photo/$value', header)
.subscribe(blob =>
this.imageService.getImageUrlFromBlob(blob)
.then(res =>
this.user.userImage = res;
)
)
);



I am trying to do the same thing with a new function, except I want the function to return the value instead of setting a value in the component. I have searched all over and most likely I am using the wrong search terms. However, here is a pass at what I am trying to achieve



getPhoto(email: string): string 
return this.adalService.acquireToken('https://graph.microsoft.com')
.subscribe(token =>
let header = new HttpHeaders().set('Authorization', 'Bearer ' + token).set('Content-Type', 'image/jpeg');
this.imageService.getImage('https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header)
.subscribe(blob =>
this.imageService.getImageUrlFromBlob(blob)
.then(res =>
return res;
)
)
);







angular typescript microsoft-graph adal






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 16 '18 at 2:50









Brian SmithBrian Smith

15615




15615







  • 1





    If you need token for each Http request (or conditionally) you must consider HttpInterceptor

    – User3250
    Nov 16 '18 at 3:04












  • 1





    If you need token for each Http request (or conditionally) you must consider HttpInterceptor

    – User3250
    Nov 16 '18 at 3:04







1




1





If you need token for each Http request (or conditionally) you must consider HttpInterceptor

– User3250
Nov 16 '18 at 3:04





If you need token for each Http request (or conditionally) you must consider HttpInterceptor

– User3250
Nov 16 '18 at 3:04












2 Answers
2






active

oldest

votes


















1














I would suggest you to use switchMap ,since switchMap operator will wait for the response of the first request to arrive before firing the second request.



return this.http.get('https://graph.microsoft.com')
.switchMap(res1 =>
// use res1 to further control param of the second call
this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
)
.subscribe(res2 =>
//do stuff with the second response
)





share|improve this answer






























    1














    You should use merge map in the pipe. Then you can do what you are trying to do. when using merge map it wait one subscription to finish and then you can use it response in next action.



    return this.adalService.acquireToken('https://graph.microsoft.com').
    pipe(
    mergeMap(res =>
    this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
    )
    ).subscribe(res =>
    //this "res" give you the second request respond
    )





    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%2f53330728%2freturn-value-from-multiple-observable-calls-in-a-function%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1














      I would suggest you to use switchMap ,since switchMap operator will wait for the response of the first request to arrive before firing the second request.



      return this.http.get('https://graph.microsoft.com')
      .switchMap(res1 =>
      // use res1 to further control param of the second call
      this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
      )
      .subscribe(res2 =>
      //do stuff with the second response
      )





      share|improve this answer



























        1














        I would suggest you to use switchMap ,since switchMap operator will wait for the response of the first request to arrive before firing the second request.



        return this.http.get('https://graph.microsoft.com')
        .switchMap(res1 =>
        // use res1 to further control param of the second call
        this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
        )
        .subscribe(res2 =>
        //do stuff with the second response
        )





        share|improve this answer

























          1












          1








          1







          I would suggest you to use switchMap ,since switchMap operator will wait for the response of the first request to arrive before firing the second request.



          return this.http.get('https://graph.microsoft.com')
          .switchMap(res1 =>
          // use res1 to further control param of the second call
          this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
          )
          .subscribe(res2 =>
          //do stuff with the second response
          )





          share|improve this answer













          I would suggest you to use switchMap ,since switchMap operator will wait for the response of the first request to arrive before firing the second request.



          return this.http.get('https://graph.microsoft.com')
          .switchMap(res1 =>
          // use res1 to further control param of the second call
          this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
          )
          .subscribe(res2 =>
          //do stuff with the second response
          )






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 16 '18 at 2:55









          SajeetharanSajeetharan

          125k31181243




          125k31181243























              1














              You should use merge map in the pipe. Then you can do what you are trying to do. when using merge map it wait one subscription to finish and then you can use it response in next action.



              return this.adalService.acquireToken('https://graph.microsoft.com').
              pipe(
              mergeMap(res =>
              this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
              )
              ).subscribe(res =>
              //this "res" give you the second request respond
              )





              share|improve this answer



























                1














                You should use merge map in the pipe. Then you can do what you are trying to do. when using merge map it wait one subscription to finish and then you can use it response in next action.



                return this.adalService.acquireToken('https://graph.microsoft.com').
                pipe(
                mergeMap(res =>
                this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
                )
                ).subscribe(res =>
                //this "res" give you the second request respond
                )





                share|improve this answer

























                  1












                  1








                  1







                  You should use merge map in the pipe. Then you can do what you are trying to do. when using merge map it wait one subscription to finish and then you can use it response in next action.



                  return this.adalService.acquireToken('https://graph.microsoft.com').
                  pipe(
                  mergeMap(res =>
                  this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
                  )
                  ).subscribe(res =>
                  //this "res" give you the second request respond
                  )





                  share|improve this answer













                  You should use merge map in the pipe. Then you can do what you are trying to do. when using merge map it wait one subscription to finish and then you can use it response in next action.



                  return this.adalService.acquireToken('https://graph.microsoft.com').
                  pipe(
                  mergeMap(res =>
                  this.http.get(''https://graph.microsoft.com/v1.0/users/'+email+'/photo/$value', header')
                  )
                  ).subscribe(res =>
                  //this "res" give you the second request respond
                  )






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 16 '18 at 3:31









                  Rumes ShyamanRumes Shyaman

                  68211029




                  68211029



























                      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%2f53330728%2freturn-value-from-multiple-observable-calls-in-a-function%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







                      Popular posts from this blog

                      27

                      Top Tejano songwriter Luis Silva dead of heart attack at 64

                      2013 DreamHack Counter-Strike: Global Offensive Championship