从具有回调函数返回数据的最佳实践

时间:2017-01-18 23:36:33

标签: angular callback observable

我有一个服务正在调用带回调的方法

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();
   }
}

其中哪一个好?还有其他更好的方法吗?

2 个答案:

答案 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),除了它的目的。