可从回调函数观察到角度服务返回

时间:2019-11-14 13:12:08

标签: angular rxjs observable angular-services

我正在使用 Angular 8

在我的服务中,我正在使用一个接受回调函数并在回调函数中提供值的库。

我的服务方式是

raw(qrInfo, res?): Observable<string> {

  return manager.getData(res.width, (res1) => {
    return of<string>(res1);
  });
}

我想订阅此raw()方法并在控制器中获取res1的结果

constructor(
  private myS: MyService
) {}

data() {
  this.myS.raw(info, op).subscribe(res => {
    console.log(res);                              // Get value here
  }
}

但这不起作用。 如何从回调函数返回可观测值?

2 个答案:

答案 0 :(得分:2)

您可以按照以下documentation在raw()方法中创建一个新的Observable,以将回调结果发送到您的Observable中。

raw(qrInfo, res?): Observable<string> {
  /** Returns the freshly created Observable **/
  return Observable.create(function(observer) {
    /** Call your method with the callback **/
    manager.getData(res.width, (res1) => {
      /** Emit the callback response to the Observable **/
      observer.next(of<string>res1)
      /** Complete the Observable to close it **/
      observer.complete();
    });
  });
}

答案 1 :(得分:0)

您可以在MyService内创建一个Subject,然后从您的组件中进行订阅。

managerData$ = new Subject<any>();

raw(qrInfo, res?): Observable<string> {

  manager.getData(res.width, (res1) => {
    this.managerData$.next(res1);
  });
}

然后在组件中:

constructor(
  private myS: MyService
) {
    this.myS.managerData$.subscribe((res) => { ... } );
  }

data() {
  this.myS.raw(info, op);
}

注意:如果您需要退订,可以这样操作:

private managerDataSubscription: Subscription;

constructor(
  private myS: MyService
) {
    this.managerDataSubscription = this.myS.managerData$.subscribe((res) => { ... } );
  }

然后您可以在需要的地方致电this.managerDataSubscription.unsubscribe();(例如,在ngOnDestroy中)