在我的TypeScript应用程序中,我已经有了一个内部可以执行多个fromPromise
和toPromise
操作的方法:
myMethod(...): Promise<string> {
return fromPromise(this.someService1.someMethod1(...)).pipe(
mergeMap(param => fromPromise(this.someMethod2(...))),
map(param => getSomethingFromParam(param)),
).toPromise();
}
someMethod1
和someMethod2
也在内部使用toPromise
和fromPromise
。
我知道,如果我这样说的话,看起来很乱。但是,原因是每个服务中都有一个干净的API(例如,我大都使用someMethod1
和someMethod2
的结果作为承诺,因此我将其内部可观察值转换为Promise并像这样公开它)。
我当然可以重构整个东西,让我的服务公开更多的方法,例如,我可以调用直接向我返回Observable而不是Promise的方法。
我的问题是:我需要这样的重构吗?
换句话说:目前,我的服务的API非常干净,它们仅公开Promises。但是,每当我想从rxjs运算符中受益时,就必须使用fromPromise
和toPromise
。因此,我想保持目前的状态,除非这些操作(在性能方面)很昂贵。
rxjs6,因此fromPromise
不再是Global API的一部分。使用from
代替:fromPromise does not exist on type Observable
您正在转换它,以便可以使用操作员的功能。
嗯,toPromise
曾经是一个运算符,现在已直接合并到
Observable
类。如果我们看一下toPromise
的实现:toPromise(promiseCtor?: PromiseConstructorLike): Promise<T | undefined> {
promiseCtor = getPromiseCtor(promiseCtor);
return new promiseCtor((resolve, reject) => {
let value: T | undefined;
this.subscribe((x: T) => value = x, (err: any) => reject(err), () =>
resolve(value));
}) as Promise<T | undefined>;
}
}
我们可以看到toPromise订阅了Observable并获得了Promise。您要做的就是像其他任何运算符一样链接,以便您可以内部订阅可观察对象(例如
MergeMap
将对10个不同的可观察对象进行订阅)。您的实现是合法的。