Я думаю, что у меня есть базовая концепция, но есть некоторые неясности
В общем, я использую наблюдаемое:
observable.subscribe(x => {
})
Если я хочу отфильтровать данные, я могу использовать это:
import { first, last, map, reduce, find, skipWhile } from 'rxjs/operators';
observable.pipe(
map(x => {return x}),
first()
).subscribe(x => {
})
Я тоже могу это сделать:
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/first';
observable.map(x => {return x}).first().subscribe(x => {
})
Итак, мои вопросы:
- В чем разница?
- Если нет разницы, почему существует функциональная труба?
- Почему этим функциям нужен другой импорт?
pipe()
вам передавать операторы, которые вы создаете?Ответы:
Операторы "pipable" (ранее "lettable") - это текущий и рекомендуемый способ использования операторов, начиная с RxJS 5.5.
Настоятельно рекомендую прочитать официальную документацию https://rxjs.dev/guide/v6/pipeable-operators
Основное отличие состоит в том, что проще создавать пользовательские операторы и лучше использовать древовидную структуру, не изменяя при этом какой-либо глобальный
Observable
объект, который мог бы вызвать коллизии, если бы две разные стороны захотели создать оператор с тем же именем.Использование отдельного
import
оператора для каждого оператора'rxjs/add/operator/first'
было способом сделать пакеты приложений меньшего размера. Импортируя только нужные вам операторы вместо всей библиотеки RxJS, вы можете значительно уменьшить общий размер пакета. Однако компилятор не может знать, импортировали ли вы,'rxjs/add/operator/first'
потому что он вам действительно нужен в вашем коде, или вы просто забыли удалить его при рефакторинге кода. Это одно из преимуществ использования конвейерных операторов, при которых неиспользуемый импорт автоматически игнорируется.источник
unused imports are ignored automatically
, в настоящее время в IDE есть плагины, удаляющие неиспользуемый импорт.rxjs-compat
пакет github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/v6/…Трубный метод
Согласно оригинальной документации
оператор pipable заключается в том, что функция принимает наблюдаемые в качестве входных данных и возвращает другой наблюдаемый. Предыдущий наблюдаемый остается неизменным.
Исходный пост
источник
Вот хорошее резюме, которое я придумал:
Он отделяет операции потоковой передачи (отображение, фильтрация, уменьшение ...) от основных функций (подписка, конвейерная передача). Связывание операций по конвейеру вместо цепочки не загрязняет прототип Observable, что упрощает встряхивание дерева.
См. Https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md#why
источник
В чем разница? Как вы видите в своем примере, основное отличие заключается в улучшении читабельности исходного кода. В вашем примере всего две функции, но представьте, есть ли их дюжина? тогда это будет как
function1().function2().function3().function4()
это действительно становится уродливым и трудным для чтения, особенно когда вы заполняете внутренние функции. Вдобавок к этому некоторые редакторы, такие как код Visual Studio, не допускают длины более 140 строк. но если это пойдет следующим образом.
Это значительно улучшает читаемость.
Если нет разницы, почему существует функциональная труба? Функция PIPE () предназначена для объединения все функции, которые принимают и возвращают наблюдаемое. Первоначально он принимает наблюдаемый объект, затем этот наблюдаемый объект используется во всей функции pipe () каждой функцией, используемой внутри него.
Первая функция принимает наблюдаемый объект, обрабатывает его, изменяет его значение и переходит к следующей функции, затем следующая функция принимает наблюдаемый выход первой функции, обрабатывает его и переходит к следующей функции, затем продолжается до тех пор, пока все функции внутри функции pipe () используйте это наблюдаемое, наконец, у вас есть обработанный наблюдаемый. В конце вы можете выполнить наблюдаемый объект с помощью функции subscribe (), чтобы извлечь из него значение. Помните, что значения в исходном наблюдаемом не меняются. !!
Почему этим функциям нужен другой импорт? Импорт зависит от того, где функция указана в пакете rxjs. Это так. Все модули хранятся в папке node_modules в Angular. импортировать {класс} из "модуля";
В качестве примера возьмем следующий код. Я только что написал это в stackblitz. Таким образом, ничего не создается автоматически и не копируется откуда-то еще. Я не вижу смысла копировать то, что указано в документации rxjs, когда вы тоже можете пойти и прочитать это. Я предполагаю, что вы задали этот вопрос здесь, потому что не поняли документацию.
Функция Of () возвращает наблюдаемый объект, который последовательно выдает числа при подписке.
Observable еще не подписан.
Когда вы использовали его как Observable.pipe (), функция pipe () использует данный Observable в качестве входных данных.
Первая функция, функция map (), использует этот Observable, обрабатывает его, возвращает обработанный Observable обратно в функцию pipe (),
затем обработанный Observable передается следующей функции, если таковая имеется,
и так продолжается до тех пор, пока все функции не обработают Observable,
в конце, что Observable возвращается функцией pipe () переменной, в следующем примере его obs.
Теперь дело в Observable: пока наблюдатель не подписался на него, он не выдает никакого значения. Поэтому я использовал функцию subscribe (), чтобы подписаться на этот Observable, как только я подписался на него. Функция of () начинает выдавать значения, затем они обрабатываются функцией pipe (), и в конце вы получаете окончательный результат, например, 1 берется из функции of (), 1 добавляется 1 в функции map (), и вернулся обратно. Вы можете получить это значение в качестве аргумента внутри функции subscribe (function ( argument ) {}).
Если вы хотите его распечатать, используйте как
https://stackblitz.com/edit/angular-ivy-plifkg
источник