0

fromPromise在我的 TypeScript 应用程序中,我已经达到了我有一个内部执行多个操作的方法的地步toPromise

  myMethod(...): Promise<string> {
    return fromPromise(this.someService1.someMethod1(...)).pipe(
      mergeMap(param => fromPromise(this.someMethod2(...))),
      map(param => getSomethingFromParam(param)),
    ).toPromise();
  }

还有someMethod1andsomeMethod2内部使用toPromiseand fromPromise

我明白,如果我这样说,它看起来很乱。然而,原因是在每个服务中都有一个干净的 API(例如,我主要使用someMethod1andsomeMethod2作为 Promise 的结果,所以我将它们的内部 observable 转换为 Promise 并像这样公开它)。

我当然可以重构整个事情,让我的服务公开更多方法,这样我就可以调用一个方法,直接返回一个 Observable 而不是 Promise。

我的问题是:我需要这样的重构吗?

换句话说:目前我的服务的 API 非常干净,它们只暴露 Promises。但我确实必须使用 rxjs 操作符,fromPromise并且toPromise每当我想从 rxjs 操作符中受益时。所以我想保持目前的状态,除非这些操作很昂贵(就性能而言)。

4

1 回答 1

1

首先,您的标签提到rxjs6,因此fromPromise不再是全局 API 的一部分。改用fromObservable 类型上不存在 fromPromise

简短的回答,不,它并不昂贵。

您正在转换它,以便您可以使用运营商的力量。

好吧,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。

你所做的只是像任何其他操作符一样链接,这样你就可以在内部订阅 observable(例如MergeMap在 10 个不同的 Observable 上做的事情)。您的实施是合法的。

于 2020-03-12T21:57:38.280 回答