【问题标题】:Rxjs: are the fromPromise and toPromise operations expensive?Rxjs:fromPromise 和 toPromise 操作是否昂贵?
【发布时间】:2020-06-24 19:25:05
【问题描述】:

在我的 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 并像这样公开它)。

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

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

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

【问题讨论】:

    标签: typescript rxjs es6-promise rxjs6 rxjs-observables


    【解决方案1】:

    首先,您的标签提到了 rxjs6,因此 fromPromise 不再是全局 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。

    您所做的只是像任何其他运算符一样链接,因此您可以在内部订阅 observable(例如 MergeMap 将在 10 个不同的 Observable 上执行)。您的实施是合法的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-15
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      相关资源
      最近更新 更多