在RxJs Observable

时间:2017-08-31 21:52:09

标签: angular rxjs ngrx-effects

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

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

我在Angular应用程序中使用NGRX Effects,所以我希望它能作为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的错误失败?

1 个答案:

答案 0 :(得分:7)

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

这样的事情应该有效:

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