В Angular rxjs, когда я должен использовать `pipe` vs` map`

Я немного смущен оператором pipe, а просто цепочкой map. Являются ли обе приведенные ниже примеры функционально эквивалентными? Какова цель или преимущество функции трубы?

const name = ajax
  .getJSON<{ name: string }>("/api/employees/alice")
  .pipe(
    retry(3, 1000),
    map(employee => employee.name),
    catchError(error => of(null))
  );

const name = ajax
  .getJSON<{ name: string }>("/api/employees/alice")
  .let(retry(3, 1000))
  .map(employee => employee.name)
  .catch(error => Rx.Observable.of(null));

Ответ 1

"Новый" способ, используя pipe, называется Lettable Operators Pipeable Operators. "Старый" способ, в котором вы связываете операторов, вызывается с использованием "операторов патчей".

Начиная с версии 5.5, мы отправили "трубчатые операторы", к которым можно получить доступ в rxjs/operators (обратите внимание на плюрализованные "операторы" ). Они призваны стать лучшим подходом для привлечения только операторов, которые вам нужны, чем операторы "patch", найденные в rxjs/add/operator/*.

Были проблемы с с операторами патчей. Они также могут гарантировать, что ваш произведенный комплект из вашего кода меньше. Существуют и другие преимущества, см. Документацию которая довольно хорошо ее охватывает.

Чтобы ответить на другой вопрос, хотя ваши 2 примера кода функционально эквивалентны. Также вы должны использовать Pipeable Operators для операторов патчей, когда это возможно.


Из документации (для полноты)

Проблемы с исправленными операторами для точечного соединения:

  • Любая библиотека, которая импортирует оператор патча, добавит Observable.prototype для всех пользователей этой библиотеки, создав слепые зависимости. Если библиотека удаляет их использование, они неосознанно нарушают всех остальных. С помощью трубопроводов вам нужно импортировать операторы, которые вам нужны, в каждый файл, в котором вы их используете.
  • Операторы, проложенные непосредственно на прототипе, не являются "древовидными" с помощью таких инструментов, как rollup или webpack. Операторы, работающие по протоколу Pipeable, будут такими, какими они являются просто функциями, выведенными из модулей напрямую.
  • Неиспользуемые операторы, которые импортируются в приложениях, не могут быть надежно обнаружены с помощью какого-либо инструмента сборки или правила lint. Это означает, что вы можете импортировать scan, но прекратите использовать его, и он все еще добавляется в ваш выходной пакет. Если у вас есть протоколы, если вы его не используете, правило lint может забрать его для вас.
  • Функциональный состав является удивительным. Построение собственных пользовательских операторов становится намного проще, и теперь они работают и выглядят так же, как и все остальные операторы из rxjs. Вам больше не нужно расширять Observable или переопределять lift.