我有一个服务正在调用带回调的方法
import {someDataBaseFunction} from 'something/somthing';
class MyService{
myServiceFunction(param1, param2){
someDataBaseFunction(param1, param2, (error) => {
if (error)
console.log("error " + error);
else
console.log("success");
});
}
}
基于我对Angular2的短暂限制,有两种方法可以将这些数据发送回Component:
1)调用myServiceFunction时传递回调函数,如
myServiceFunction(param1, param2, (data) => {
// Do whatever with data
})
并更改myServiceFunction的签名以获取回调函数,并在someDataBaseFunction结算时调用该回调。
2)创建如下所示的ReplaySubject:
private mySubj$ = new ReplaySubject(1);
myServiceFunction(param1, param2){
someDataBaseFunction(param1, param2, (error) => {
if(error){
console.log(error);
this.mySubj$.error(error);
}
else {
this.mySubj$.next('success'); //Whatever
}
});
getDataObs$(){
return this.mySubj$.asObservable();
}
}
其中哪一个好?还有其他更好的方法吗?
答案 0 :(得分:1)
我不会说......第一种方法简单而实用,但你不能用其他操作编写/链/映射。
第二个没有太大意义:所以你创建一个ReplaySubject
这么多订阅者可以得到结果,但是把它包装在另一个函数中?因此,组件必须要做:
this.myService.myServiceFunction(...)
this.myService.getDataObs().subscribe(...)
哪个可能产生错误的值(想象第二次调用这个东西...... getDataObs会产生myServiceFunction的前一个结果)或者如果myServiceFunction返回ReplaySubject
,那么为什么要将它包装在第一个的ReplaySubject中地点?你不能这样做:
myServiceFunction(param1, param2){
return Rx.Observable.create(obs => {
someDataBaseFunction(param1, param2, (error) => {
if(error){
console.log(error);
obs.error(error);
}
else {
obs.next('success'); //Whatever
}
});
});
}
这样,组件只需将函数调用为
this.myService.myServiceFunction(...).subscribe(...)
如果您想要某种缓存(例如someDataBaseFunction
仅调用一次),请考虑使用publish
运算符。为此,您必须在初始化服务时创建流并发布/连接它。
答案 1 :(得分:0)
方法2是去恕我直言的方法。您的服务不应该做太多(例如,调用您的自定义函数errorFunc
),除了它的目的。