2017-09-09 85 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'); 
    } 
} 

希望有帮助!