web-dev-qa-db-ja.com

Angular 5同期HTTPコール

Angular 5アプリケーションがあり、その中で重いRESTサービス(通常は数秒かかります)。アプリケーションのさまざまな部分で結果が必要です。 、したがって、結果をDataStorageServiceに保存したいと思います。

@Injectable()
export class DataStorageService {

private result: MyCustomObject;

constructor(private service: Service) {}

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

問題は、HTTP要求が終了するまで待機してから、「結果」オブジェクトを保存して返す方法です。 PromiseとObservableも使用して解決しようとしましたが、どれもうまくいきませんでした。

  1. 観察可能:

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

    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

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

質問は、HTTP要求が終了するまで待機してから、「re sult」オブジェクトを保存して返す方法です

//サービス中のコード:

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

//これはコンポーネント内のコードです。

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

    }

お役に立てれば。

0
Dheeraj Kumar