web-dev-qa-db-fra.com

Angular 5 appels HTTP synchrones

J'ai une application Angular 5 dans laquelle je dois appeler un service lourd REST (prend généralement quelques secondes). J'ai besoin de son résultat dans différentes parties de l'application, je voudrais donc stocker le résultat dans un DataStorageService. En gros, voici ce que je voudrais réaliser:

@Injectable()
export class DataStorageService {

private result: MyCustomObject;

constructor(private service: Service) {}

getResult(): MyCustomObject {
    if (typeof this.result === 'undefined') {
        // save result
    }
    return result;
}

La question est de savoir comment je peux attendre que la requête HTTP soit terminée, puis sauvegarder et renvoyer l'objet 'result'. J'ai essayé de le résoudre en utilisant Promise et Observable également, mais aucun d'entre eux n'a bien fonctionné.

  1. Observable:

    if (typeof this.result === 'undefined') {
        this.service.call()
            .subscribe(response => this.result = response);
    }
    return this.result;  // wait for save and return MyCustomObject
    
  2. Promettre:

    if (typeof this.result === 'undefined') {
        this.service.call()
            .toPromise()
            .then(response => this.result = response);
    }
    return this.result;  // wait for save and return MyCustomObject
    
11
aszidien

Essayez d'utiliser await/async

async getResult(): Promise<MyCustomObject> {
    if (typeof this.result === 'undefined') 
    {
        // save result
        this.result = await this.service.call()
        .toPromise()
        .then(resp =>resp as MyCustomObject);//Do you own cast here

    }
    return this.result;
}
14
David

La question est de savoir comment je peux attendre que la requête HTTP soit terminée, puis sauvegarder et retourner l'objet 'résultat'.

// Code en service:

ServiceMethod:Observabke<any>(){
     if (typeof this.result === 'undefined') {
                return this.service.call().map(res=>res);
}

// Ceci est le code dans le composant.

 componentMethod(){


        return this.service.ServiceMethod()
            .subscribe(response => {
                this.result = response;
               },
               ()=>//handle error,
               () => // call completed { return this.result;  // Subscriber});
    }
    return this.weeklyPlayer;  // MyCustomObject (This return won't wait for http to get completed. Not sure why you want multiple returns.)

    }

J'espère que cela t'aides.

0
Dheeraj Kumar