我是RxJs的新手,我有一个API用于地理编码,提供如下函数:
simpleGeocode(options)
* where options = { address: {addr: ... }, success: Function, failure: Function}. The success function returns the geocoded LatLon object.
Run Code Online (Sandbox Code Playgroud)
我在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);
},
Run Code Online (Sandbox Code Playgroud)
但我完全不知道如何将该库调用包装成一个Observable.我从http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindCallback上读到了一些关于bindCallback()的信息,但我并不完全理解它.我确实理解它需要一个回调方法作为函数的最后一个参数,因此它看起来不适用于我的情况,因为成功和失败函数都作为对象的一部分传递给函数.
我如何从这个API方法中创建一个Observable,将成功回调映射到Observable的下一个,以及Observable的错误失败?
这应该是一个简单的解决方案,但我似乎无法把它放在一起......
我有一个返回 Promise 的函数和另一个返回 Promise 的函数。我需要使用前者的返回值调用后者,但我还需要在转换链的末尾使用这两个值。我已经阅读了一些关于 mergeMap 和 forkJoin 的文档,但我似乎无法使用它们来获得我需要的结果:
function getBlob(id: string): Promise<Blob>;
function blobToBase64(imageBlob: Blob): Promise<string>;
// ...
// This is what I tried but I getting Observables back after the forkJoin instead of the actual values
return Observable.fromPromise(getBlob(id))
.map((blob) => return Observable.forkJoin([Observable.of(blob), Observable.fromPromise(blobToBase64)])
// data[0] and data[1] are undefined but it looks like data is actually an Observable from forkJoin.
.map((data) => console.log(`Here is ${data[0]} and ${data[1]}`);
Run Code Online (Sandbox Code Playgroud)
谁能解释一下如何在最后得到 blob 和 base64 值?