2017-09-09 83 views
0

我有以下功能:如何從Observer返回值?

private getTranslateMenuItem(key: string): string { 
     this.translate.get(key).subscribe((res: string) => { 
     return res; 
    }); 
    } 

我需要它返回我SRING數據時,我把這種喜歡:

let title = this.getTranslateMenuItem('pop'); 
+0

不要返回值,而是返回observable並允許消費者根據需要訂閱(next,error,complete)來設置組件屬性,處理錯誤等。如果您需要使用其他可觀察值動作操作符如switchMap或mergeMap可以幫助實現這一點。 –

+0

你有沒有這樣建議:​​'private getTranslateMenuItem(key:string):Observable {}'? – user3573738

回答

2

而是試圖返回被觀察到發射的價值,嘗試只需返回Observable並允許消費者利用發射值,如設置類屬性:

服務:

public getTranslateMenuItem(key: string): Observable<string> { 
    return this.translate.get(key); 
} 

組件:

import { Component } from '@angular/core'; 

@Component({ 
    selector: 'my-app', 
    template: '{{title}}' 
}) 
export class AppComponent { 
    title: string; 

    constructor(private someService: SomeService) {} 

    ngOnInit(): void { 
    this.someService.getTranslateMenuItem('foobar') 
     .subscribe(
      value => this.title = value, 
      error => console.log(error), 
      complete => console.log('Completed'); 
     ); 
    } 
} 

這種方法,你會處理值,錯誤和完整的組件,並允許根據需要將服務只是處理檢索和處理/格式化值。

或者,您可以使用組件模板中的async管道來訂閱/取消訂閱發出的值。

import { Component } from '@angular/core'; 

@Component({ 
    selector: 'my-app', 
    template: '{{title$ | async}}' 
}) 
export class AppComponent { 
    title$: Observable<string>; 

    constructor(private someService: SomeService) {} 

    ngOnInit(): void { 
    this.title$ = this.someService.getTranslateMenuItem('foobar'); 
    } 
} 

希望有幫助!