2017-06-11 5 views
0

サービス内の機能:角度2通過値

getUserInfo() { 
    this.af.authState.subscribe(authData => { 
     let email = authData.email; 
     let array = this.database.list('registeredUsers', { 
     query: { 
     orderByChild: 'email', 
     equalTo: email 
     } 
     }).subscribe(data => { 
     let userFName = data[0].firstName; 
     }); 
    }); 
    } 

コンポーネント:

ngOnInit() { 
    this.afService.getUserInfo(); 
    } 

機能自体は素晴らしい作品が、どのように私はlet userFName変数が内で使用されるように渡します成分?

+0

Observableをどのようにサブスクライブしましたか? – omeralper

+0

彼はしませんでしたか?最初のサブスクライブはauthState、2番目のサブスクリプションはdatabase.listです。 – Baruch

答えて

3

あなたが望むように聞こえるのは、これを注射可能なサービスにすることです。これにより、どのコンポーネントからでも呼び出すことができます。

返す新しい約束事を作成するのが最適です。これは、database.listの呼び出しが解決されると解決できます。

@Injectable() 
export class MyService() { 
    public userFName; 

    getUserInfo() { 
     // return a new promise, which you resolve once you get the data 
     return new Promise((resolve, reject) => { 
      this.af.authState.subscribe(authData => { 
       let email = authData.email; 
       let array = this.database.list('registeredUsers', { 
       query: { 
        orderByChild: 'email', 
        equalTo: email 
       } 
       }).subscribe(data => { 
        let userFName = data[0].firstName; 

        // resolve promise with username 
        resolve(userFName); 
       }); 
      }); 
     }); 
    } 
} 

とコンポーネント

@Component({ 
    providers: [MyService] 
)} 
export class MyComponent { 
    constructor(private myService: MyService) { 
     myService.getUserInfo().then(userFName => { 
      console.log('userFName =', userFName); 
     }); 
    } 
} 
+0

コンポーネント 'subscribe'のプロパティがサブスクリプションの 'サブスクリプション'タイプに存在しません。 –

+0

あなたがgetUserInfo関数が内部のdatabase.list呼び出しが完了した後に解決できる新しいPromiseを返すように修正された、それはネストされた約束であることに気づいていませんでした。 –

0

あなたが@angular/httpあなたのHTTP要求を使用している場合rxjs/Observableを返す必要があります。そしてあなたがそれを購読すれば、それは購読を返します。サブスクリプションクラスの再登録はできません。

import {Observable} from "rxjs"; 
@Injectable() 
export class MyService() { 

    public userFName; 
    getUserInfoPromise():Observable<MyResponseType> { 
     let someObservable = this.someApi.someRequestPOST(request).mergeMap((response:MyResponsType) => { 
     //you can process the response data here before components use it 
       this.userFName = response.userFName; 
       return new Promise(resolve => resolve(response)); 
     }); 
     return someObservable; 
    } 
} 

あなたのコンポーネントでは、この方法でサブスクリプションチェーンに参加するだけです。

this.myService 
      .getUserInfoPromise(requestData) 
      .subscribe(
       (res: MyResponseType) => { 

       }, (error) => { 

       });