How to synchronise Angular2 http get?

后端 未结 8 1318
無奈伤痛
無奈伤痛 2021-01-07 19:27

I understand using observable I can execute a method when the request is completed, but how can i wait till a http get is completed and return the response using in ng2 http

相关标签:
8条回答
  • 2021-01-07 19:40

    You should not try to make http calls behave synchronously. Never a good idea.

    Coming to your getAllUser implementation it should return an observable from the function and the calling code should subscribe instead of you creating a subscription inside the method itself.

    Something like

    getAllUser(): Observable<UserDTO> {
            return this.http.get("MY_URL")
                            .map(res => res.json());
    } 
    

    In you calling code, you should subscribe and do whatever you want.

    0 讨论(0)
  • 2021-01-07 19:41

    Please find code for your problem Below is component and service file.And Code is Working fine for synchornize

    import { Component, OnInit } from '@angular/core';
    import { LoginserviceService } from '../loginservice.service';
    
    @Component({
      selector: 'app-login',
      templateUrl: './login.component.html',
      styleUrls: ['./login.component.css']
    })
    export class LoginComponent implements OnInit {
      model:any={};
      constructor(private service : LoginserviceService) { 
    }
    
    ngOnInit() {
    
    }
    save() {
       this.service.callService(this.model.userName,this.model.passWord).
       subscribe(
          success => {
            if(success) {
                console.log("login Successfully done----------------------------    -");
                this.model.success = "Login Successfully done";
         }},
        error => console.log("login did not work!")
      );
     }
    
    }
    

    Below is service file..

    import { Injectable } from '@angular/core';
    import { Http } from '@angular/http';
    import { UserData } from './UserData';
    import 'rxjs/add/operator/map'
    import 'rxjs/add/operator/toPromise'
    import {Observable} from 'rxjs/Rx'
    
    @Injectable()
       export class LoginserviceService {
       userData = new UserData('','');   
       constructor(private http:Http) { }
    
        callService(username:string,passwrod:string):Observable<boolean> {
         var flag : boolean;      
         return (this.http.get('http://localhost:4200/data.json').
           map(response => response.json())).
            map(data => {
              this.userData = data;
              return this.loginAuthentication(username,passwrod);
            });
          }
    
      loginAuthentication(username:string,passwrod:string):boolean{
         if(username==this.userData.username && passwrod==this.userData.password){
            console.log("Authentication successfully")
            return true;
       }else{
         return false;
       }
    
    
      }
    }
    
    0 讨论(0)
  • 2021-01-07 19:44

    as you see, first callback waiting for a data from request and there you can go on with your logic (or use the third one)

    example:

    .. subscribe( data => { 
                  this.value = data; 
                  doSomeOperation;
                  }, 
                  error => console.log(error), 
                  () => {console.log("Completed");
                          or do operations here..;
                        }
    });
    
    0 讨论(0)
  • 2021-01-07 19:45

    your service class: /project/app/services/sampleservice.ts

        @Injectable()
        export class SampleService {
    
          constructor(private http: Http) {
          }
    
          private createAuthorizationHeader() {
             return new Headers({'Authorization': 'Basic ZXBossffDFC++=='});
          }
    
    
          getAll(): Observable<any[]> {
            const url='';
            const active = 'status/active';
            const header = { headers: this.createAuthorizationHeader() };
            return this.http.get(url + active, header)
              .map(
                res => {
                  return res.json();
                });
          }
    
        }
    

    your component: /project/app/components/samplecomponent.ts

    export class SampleComponent implements OnInit  {
    
    
      constructor(private sampleservice: SampleService) {
      }
    
      ngOnInit() {
       this.dataset();
      }
    
      dataset(){
        this.sampleservice.getAll().subscribe(
          (res) => {
            // map Your response with model class
            // do Stuff Here or create method 
            this.create(res);
          },
          (err) => { }
        );
      }
      create(data){
       // do Your Stuff Here
      }
    
    }
    
    0 讨论(0)
  • 2021-01-07 19:50

    By looking at the angular source (https://github.com/angular/angular/blob/master/packages/http/src/backends/xhr_backend.ts#L46), it is apparent that the async attribute of the XMLHttpRequest is not getting used. The third parameter of XMLHttpRequest needs to be set to "false" for synchronous requests.

    0 讨论(0)
  • 2021-01-07 19:52

    I looked and I couldn't find any way to make an HTTP call sync instead of async.

    So the only way around this: wrap your call in a while loop with a flag. Don't let the code continue until that flag has "continue" value.

    Pseudo code as follows:

    let letsContinue = false;
    
    //Call your Async Function
    this.myAsyncFunc().subscribe(data => {
       letsContinue = true;
    }; 
    
    while (!letsContinue) {
       console.log('... log flooding.. while we wait..a setimeout might be better');
    }
    
    0 讨论(0)
提交回复
热议问题