Rx js: дорогие операции fromPromise и toPromise? - PullRequest
0 голосов
/ 12 марта 2020

В моем приложении 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 в качестве обещаний, поэтому я конвертирую их внутреннюю наблюдаемость в Обещание и выставляю их вот так).

Я мог бы, конечно, все изменить, имея свои службы для предоставления большего количества методов, чтобы я мог, например, вызвать метод, который возвращает мне непосредственно Observable вместо Promise.

Мой вопрос: нужны ли мне такие рефакторинг?

Другими словами: в настоящее время API моих сервисов довольно чистые, они только предоставляют Обещания. Но я должен играть с fromPromise и toPromise всякий раз, когда я хочу получить выгоду от операторов rx js. Поэтому я хотел бы оставить все как есть, если только эти операции не дороги (с точки зрения производительности).

1 Ответ

1 голос
/ 13 марта 2020

Во-первых, ваш тег упоминает rxjs6 , поэтому fromPromise больше не является частью Глобального API. Вместо этого используйте from: fromPromise не существует для типа 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 различных Наблюдаемых). Ваша реализация le git.

...