2017-06-11 69 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

@omeralper他没有?第一个订阅是authState,第二个是数据库。列表 – 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

糟糕的是,它并没有意识到它是一个嵌套的promise,因此getUserInfo函数返回一个新的Promise,一旦内部database.list调用完成,您就可以解析它。 –

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) => { 

       });