Async initialization of Angular 2 service

后端 未结 2 388
执念已碎
执念已碎 2021-02-05 07:12

I have an Angular 2 service that needs to do async work when it is initalized, and should not be usable before this initialization has been completed.



        
相关标签:
2条回答
  • 2021-02-05 07:32

    You could leverage an observable to do that with the flatMap operator. If the user isn't there, you could wait for it and then chain the target request.

    Here is a sample:

    @Injectable()
    export class Api {
      private user;
      private storage;
      private userInitialized = new Subject();
    
      constructor(private http: Http) {
        this.storage = LocalStorage;
        this.storage.get('user').then(json => {
          if (json !== "") {
            this.user = JSON.parse(json);
            this.userInitialized.next(this.user);
          }
        });        
      }
    
      // one of many methods
      public getSomethingFromServer(): Observable<...> {
        // make a http request that depends on this.user
        if (this.user) {
          return this.http.get(...).map(...);
        } else {
          return this.userInitialized.flatMap((user) => {
            return this.http.get(...).map(...);
          });
        }
      }
    }
    
    0 讨论(0)
  • 2021-02-05 07:34

    After working with Thierry's answer for a bit, I discovered that it would only work once, but it did set me on the right path. I had to instead store the promise of the user, and create a new observable which is then flatMap-ed.

    @Injectable()
    export class Api {
      private userPromise: Promise<User>;
    
      constructor(private http: Http) {
        this.userPromise = LocalStorage.get('user').then(json => {
          if (json !== "") {
            return JSON.parse(json);
          }
          return null;
        });        
      }
    
      public getSomethingFromServer() {
          return Observable.fromPromise(this.userPromise).flatMap((user) => {
            return this.http.get(...).map(...);
          });
        }
      }
    }
    

    This ensures that the flatMap function gets the user every time it is called, instead of just the first time, as in Thierry's answer.

    0 讨论(0)
提交回复
热议问题