在 RxJs Observable 中包装一个 API 函数
Wrap an API function in an RxJs Observable
我是 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 设置,例如:
@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 的错误?
您可以使用 Observable.create 包装带有回调接口的外部库。
类似的东西应该可以工作:
Observable.create(observer => {
geocoder.geocode({'address': address}, function(results, status) {
if (status === 'OK') {
observer.next(results);
observer.complete();
}
else {
observer.error(status);
}
});
});
我是 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 设置,例如:
@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 的错误?
您可以使用 Observable.create 包装带有回调接口的外部库。
类似的东西应该可以工作:
Observable.create(observer => {
geocoder.geocode({'address': address}, function(results, status) {
if (status === 'OK') {
observer.next(results);
observer.complete();
}
else {
observer.error(status);
}
});
});