【问题标题】:Wrap an API function in an RxJs Observable在 RxJs Observable 中包装 API 函数
【发布时间】:2017-08-31 21:52:08
【问题描述】:

我是 RxJs 的新手,我有一个用于地理编码的 API,它提供如下功能:

simpleGeocode(options)
* where options = { address: {addr: ... }, success: Function, failure: Function}. The success function returns the geocoded LatLon object.

我在带有 NGRX 效果的 Angular 应用程序中使用它,所以我希望它可以作为 Observable 使用,这样我就可以使用标准效果设置,例如:

@Effect()
public calculateLocation: Observable<void> = this.actions
    .ofType(actions.CALCULATE_LOCATION)
    .switchMap((action) => {
        let location = action.payload;

        let options = {
            address: location.address
        };
         // ...

        this.geocodeService.simpleGeocode(options)
            .map(latLon => new actions.CalculateLocationSuccessAction(latLon);
            .catch(error => new actions.CalculateLocationFailureAction(error);
        },

但我完全不知道如何包装该库调用以使其成为 Observable。我从http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindCallback 阅读了一些关于bindCallback() 的信息,但我并不完全理解。我确实理解它需要一个回调方法作为函数的最后一个参数,所以它看起来不适用于我的情况,因为成功和失败函数都作为对象的一部分传递给函数。

我如何从这个 API 方法中创建一个 Observable,将成功回调映射到 Observable 的下一个,并将失败映射到 Observable 的错误?

【问题讨论】:

    标签: angular rxjs ngrx-effects


    【解决方案1】:

    您可以使用 Observable.create 来包装带有回调接口的外部库。

    类似的东西应该可以工作:

    Observable.create(observer => {
      geocoder.geocode({'address': address}, function(results, status) {
       if (status === 'OK') {
         observer.next(results);
         observer.complete();
       }
       else {
         observer.error(status);
       }
      });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 2020-02-25
      • 2016-04-09
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多