什么时候应该在BehaviorSubject中使用asObservable()?

时间:2019-08-06 07:37:33

标签: angular typescript rxjs observable behaviorsubject

注意:您可以只看一下方法1和方法2部分,它们是两种方法之间的唯一区别:

我使用以下方法来通知我的Angular应用中的其他组件:

@Injectable()
export class DataService {        

    private eventTracker = new BehaviorSubject<any>();

    // ??? Approach 1 
    getEvent(): BehaviorSubject<any> {
        return this.eventTracker;
    }

    setEvent(param: any) {
        this.eventTracker.next(param);
    }      
}



export class DemoComponent implements OnInit {

    subscription;

    ngOnInit() {
        subscription = dataService.getEvent().subscribe((param: any) => {
            //do what ever needs doing when data changes
        });
    }

    //update the value of data in the service
    this.eventProxyService.setEvent(param);
}


另一方面,通过Observable也有类似的用法,如下所示(发布在Angular BehaviorSubject Service上):

@Injectable()
export class DataService {

    private eventTracker = new BehaviorSubject<any>();

    // ??? Approach 2 
    data = this.eventTracker.asObservable();

    setEvent(param: any){
        this.eventTracker.next(data);
    }      
}





export class DemoComponent implements OnInit {

    subscription;

    ngOnInit() {
        dataService.data.subscribe(data => {
          //do what ever needs doing when data changes
        })
    }

    //update the value of data in the service
    dataService.updateData(newData);
}

差异 优点 缺点 < / strong>在上述两种方法之间?

1 个答案:

答案 0 :(得分:4)

由于所有RxJS主题都扩展了Observable类,因此可以在BehaviorSubject实例上使用所有Observable和Subject方法。 asObservable方法不仅将其强制转换为Observable,而且还删除了Observer实现。因此,您将无法在next返回的实例上调用errorcompleteasObservable()

以下是简单的ts:

const sub = new BehaviorSubject<any>(null);
sub.next('foo'); // works as intended
const obs = sub.asObservable();
obs.next('bar'); // doesn't work at all

为了提高源代码的可预测性,我不会公开展示整个Subject实例。我宁愿使用公共方法来在主题上发出值,并仅公开Subject的Observable实例。所以我一定会倾向于您的第二种方法。