RxJS में पाइप क्या है


103

मुझे लगता है कि मेरे पास आधार अवधारणा है, लेकिन कुछ अस्पष्टताएं हैं

तो सामान्य तौर पर यह है कि मैं कैसे एक अवलोकन योग्य का उपयोग करता हूं:

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 => {

})

तो मेरे सवाल हैं:

  1. अंतर क्या है?
  2. यदि कोई अंतर नहीं है, तो फ़ंक्शन पाइप क्यों मौजूद है?
  3. उन कार्यों को अलग-अलग आयात की आवश्यकता क्यों है?

1
मैं यह कहने वाला था कि यह कस्टम, गैर-देशी, ऑपरेटरों के लिए है, लेकिन मुझे यह भी नहीं पता कि यह सही है या नहीं। क्या pipe()आप उन ऑपरेटरों को पास करते हैं जो आप बनाते हैं?
शून्य 298

जवाबों:


69

"पाइपेबल" (पूर्व "लेटेबल") ऑपरेटर आरएक्सजेएस 5.5 के बाद से ऑपरेटरों का उपयोग करने का वर्तमान और अनुशंसित तरीका है।

मैं आपको आधिकारिक दस्तावेज https://rxjs.dev/guide/v6/pipeable-operators पढ़ने की जोरदार सलाह देता हूं

मुख्य अंतर यह है कि कस्टम ऑपरेटरों को बनाना आसान है और यह बेहतर है Observableकि कुछ वैश्विक वस्तु में बदलाव न करते हुए यह संभव हो, जो दो अलग-अलग दलों को एक ही नाम का ऑपरेटर बनाना चाहते हैं, यदि संभव हो तो टकराव हो सकता है।

importप्रत्येक ऑपरेटर के लिए अलग स्टेटमेंट का उपयोग 'rxjs/add/operator/first'करना छोटे ऐप बंडल बनाने का एक तरीका था। संपूर्ण RxJS लाइब्रेरी के बजाय केवल ऑपरेटर्स को आयात करने से आप कुल बंडल आकार को काफी कम कर सकते हैं। हालाँकि संकलक यह नहीं जान सकता है कि आपने आयात किया है 'rxjs/add/operator/first'क्योंकि आपको वास्तव में कोड में इसकी आवश्यकता है या आप अपने कोड को रीफ़ैक्टर करते समय इसे निकालना भूल गए हैं। यह पाइपलाइन योग्य ऑपरेटरों के उपयोग के लाभों में से एक है जहां अप्रयुक्त आयातों को स्वचालित रूप से अनदेखा किया जाता है।


1
आपके पुष्टि के बारे में unused imports are ignored automatically, वर्तमान में आईडीई के पास प्लगइन्स हैं जो अप्रयुक्त आयातों को हटाते हैं।
सिल्वनासनो

हर कोई इन आईडीई या इन प्लगइन्स का उपयोग नहीं कर रहा है, कई लोग मूल पाठ संपादक का उपयोग करते हैं। संभवतः अधिकांश समय हम इस कथन पर भरोसा नहीं कर सकते हैं कि टीम में हर एक एक ही आईडीई / प्लगइन सेट / टेक्स्ट एडिटर का उपयोग कर रहा है जैसे हम हैं।
एडम फ़ारना

3
@AdamFaryna यकीन है, कुछ टीमें कागज पर कोड भी लिख सकती हैं, लेकिन अगर उनके पास आधुनिक उपकरण उपलब्ध हैं तो वे क्यों करेंगे? पाठ संपादक का उपयोग करना, विशेष रूप से महत्वपूर्ण प्लगइन्स के बिना कागज पर कोड लिखना समान है। आप ऐसा कर सकते हैं, लेकिन कोई भी सभ्य टीम / डेवलपर ऐसा क्यों करेगा
Denes Papp

@DenesPapp कोड संपादक तब तक मायने नहीं रखता है जब तक कि लोग इसे उत्पादक तरीके से उपयोग नहीं कर सकते हैं। इसके अलावा, यह सिर्फ व्यक्तिगत प्राथमिकताएं हैं। कागज पर कोड लिखने की आपकी समानता गलत है, आप कागज पर कोड निष्पादित नहीं कर सकते हैं लेकिन किसी भी पाठ संपादक में लिखे गए कोड को निष्पादित किया जा सकता है।
एडम फ़रना

1
@perymimon आप लेकिन आपको rxjs-compatपैकेज स्थापित करना पड़ सकता है github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/v6/…
martin

16

पाइप विधि

मूल दस्तावेज के अनुसार

पाइप करने योग्य ऑपरेटर यह है कि फ़ंक्शन एक इनपुट के रूप में वेधशालाओं को लेते हैं और यह एक और अवलोकन योग्य है।

pipe(...fns: UnaryFunction<any, any>[]): UnaryFunction<any, any>

मूल पोस्ट

पाइप का क्या मतलब है?

इसका मतलब है कि आपके द्वारा पूर्व में देखे गए किसी भी ऑपरेटर का उपयोग शुद्ध कार्यों के तहत उपलब्ध है rxjs/operators। यह ऑपरेटरों की एक संरचना का निर्माण करता है या ऑपरेटरों का फिर से उपयोग करना वास्तव में आसान हो जाता है, बिना सभी प्रकार के प्रोग्रामिंग जिमनास्टिक्स का सहारा लेने के बिना, जहां आपको एक अवलोकन योग्य व्यापक अवलोकन बनाना होगा, फिर अपनी खुद की कस्टम चीज़ बनाने के लिए लिफ्ट को अधिलेखित करें।

const { Observable } = require('rxjs/Rx')
const { filter, map, reduce,  } = require('rxjs/operators')
const { pipe } = require('rxjs/Rx')

const filterOutWithEvens = filter(x => x % 2)
const doubleByValue = x => map(value => value * x);
const sumValue = reduce((acc, next) => acc + next, 0);
const source$ = Observable.range(0, 10)

source$.pipe(
  filterOutWithEvens, 
  doubleByValue(2), 
  sumValue)
  .subscribe(console.log); // 50

@VladKuts कोड बदलते हैं और असुविधा के लिए विशेषता .sorry दिए जाते हैं।
चनाका वेरासिंघे

धन्यवाद, मुझे एहसास भी नहीं हुआ कि मैं पाइप-सक्षम ऑपरेटरों को फ़ंक्शन संदर्भ के रूप में संग्रहीत कर सकता हूं और उन्हें पाइप () कॉल में उपयोग कर सकता हूं। यह हमेशा इनलाइन करने की तुलना में बहुत साफ है।
एलेक्स। एक

9

मेरे पास एक अच्छा सारांश है:

यह कोर कार्यक्षमता (सदस्यता, पाइपिंग) से स्ट्रीमिंग संचालन (मानचित्र, फ़िल्टर, कम ...) को डिकॉय करता है। जंजीरों के बजाय संचालन को पाइप करके, यह ऑब्जर्वेबल के प्रोटोटाइप को प्रदूषित नहीं करता है जिससे पेड़ हिलाना आसान हो जाता है।

Https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md#why देखें

डॉट-चेनिंग के लिए पैच किए गए ऑपरेटरों के साथ समस्याएं हैं:

कोई भी लाइब्रेरी जो पैच ऑपरेटर का आयात करती है, उस लाइब्रेरी के सभी उपभोक्ताओं के लिए अंध निर्भरता पैदा करते हुए Observable.prototype को उन्नत करेगी। यदि पुस्तकालय उनके उपयोग को हटा देते हैं, तो वे अनजाने में बाकी सभी को तोड़ देते हैं। पाइपलाइनों के साथ, आपको उन ऑपरेटरों को आयात करना होगा जिनकी आपको प्रत्येक फ़ाइल में आवश्यकता होती है जो आप उनका उपयोग करते हैं।

प्रोटोटाइप पर सीधे पैच किए गए ऑपरेटर रोलअप या वेबपैक जैसे टूल द्वारा "ट्री-शेकेबल" नहीं हैं। जंगम संचालकों के रूप में वे सीधे मॉड्यूल से खींचे गए कार्य हैं।

अप्रयुक्त संचालकों को जो ऐप्स में आयात किया जा रहा है, उन्हें किसी भी प्रकार के बिल्ड टूलिंग या लिंट नियम द्वारा मज़बूती से नहीं पहचाना जा सकता है। इसका मतलब है कि आप स्कैन आयात कर सकते हैं, लेकिन इसका उपयोग करना बंद कर दें, और यह अभी भी आपके आउटपुट बंडल में जोड़ा जा रहा है। पाइप करने योग्य ऑपरेटरों के साथ, यदि आप इसका उपयोग नहीं कर रहे हैं, तो एक प्रकार का नियम इसे आपके लिए चुन सकता है।

क्रियात्मक रचना कमाल की है। अपने खुद के कस्टम ऑपरेटरों का निर्माण बहुत आसान हो जाता है, और अब वे rxjs से अन्य सभी ऑपरेटरों की तरह काम करते हैं और देखते हैं। आपको अब अवलोकन योग्य या ओवरराइड लिफ्ट का विस्तार करने की आवश्यकता नहीं है।


8

अंतर क्या है? जैसा कि आप अपने उदाहरण में देखते हैं, मुख्य अंतर स्रोत कोड की पठनीयता में सुधार करना है। आपके उदाहरण में केवल दो कार्य हैं, लेकिन कल्पना कीजिए कि क्या एक दर्जन कार्य हैं? तो यह पसंद आएगा

function1().function2().function3().function4()

यह वास्तव में बदसूरत हो रहा है, और पढ़ना मुश्किल है, खासकर जब आप कार्यों के अंदर भर रहे हैं। विज़ुअल स्टूडियो कोड जैसे कुछ संपादकों के शीर्ष पर 140 से अधिक लाइन की लंबाई की अनुमति नहीं है। लेकिन अगर यह निम्नलिखित की तरह हो जाता है।

Observable.pipe(
function1(),
function2(),
function3(),
function4()
)

यह पठनीयता में अत्यधिक सुधार करता है।

यदि कोई अंतर नहीं है, तो फ़ंक्शन पाइप क्यों मौजूद है? PIPE () फ़ंक्शन का उद्देश्य सभी कार्यों को एक साथ गांठ करना है , और अवलोकन योग्य वापस करना है। यह शुरू में एक नमूदार होता है, फिर उस पाइप का उपयोग पूरे समारोह में किया जाता है।

पहला फ़ंक्शन अवलोकनीय लेता है, इसे संसाधित करता है, इसके मूल्य को संशोधित करता है, और अगले फ़ंक्शन को पास करता है, फिर अगला फ़ंक्शन पहले फ़ंक्शन के अवलोकनीय लेता है, इसे संसाधित करता है, और अगले फ़ंक्शन को पास करता है, फिर यह सभी फ़ंक्शन तक चलता है पाइप के अंदर () फंक्शन का उपयोग किया जा सकता है जो देखने योग्य है, अंत में आपके पास प्रोसेस्ड है। अंत में आप मान को सदस्यता से हटा सकते हैं () फ़ंक्शन इसके मूल्य को निकालने के लिए। याद रखें, मूल अवलोकन में मूल्यों को नहीं बदला जाता है। !! 

उन कार्यों को अलग-अलग आयात की आवश्यकता क्यों है? आयात उस जगह पर निर्भर करता है जहां फ़ंक्शन rxjs पैकेज में निर्दिष्ट है। यह इस प्रकार चलता है। सभी मॉड्यूल कोणीय_ में नोड_मॉडल फ़ोल्डर में संग्रहीत किए जाते हैं। "मॉड्यूल" से {class} आयात करें;

एक उदाहरण के रूप में निम्नलिखित कोड लेते हैं। मैंने इसे स्टैकब्लिट्ज़ में लिखा है। तो कुछ भी स्वचालित रूप से उत्पन्न नहीं होता है, या कहीं और से कॉपी किया जाता है। जब आप जा सकते हैं और इसे भी पढ़ सकते हैं, तो मुझे rxjs प्रलेखन में जो कहा गया है, उसे कॉपी करने का बिंदु नहीं दिख रहा है। मुझे लगता है कि आपने यह प्रश्न यहां पूछा है, क्योंकि आप प्रलेखन को नहीं समझते थे। 

  • संबंधित मॉड्यूल से आयातित पाइप, अवलोकन योग्य, मानचित्र कक्षाएं हैं। 
  • कक्षा के शरीर में, मैंने पाइप () फ़ंक्शन का उपयोग किया जैसा कि कोड में देखा गया है। 
  • फ़ंक्शन () फ़ंक्शन एक अवलोकन योग्य देता है, जो क्रमांकित होने पर क्रम में संख्याओं का उत्सर्जन करता है।

  • अभी तक अवलोकन योग्य नहीं है।

  • जब आप इसका उपयोग करते हैं, तो यह अवलोकन योग्य होता है। पाइप () फ़ंक्शन, इनपुट के रूप में दिए गए ऑब्जर्वेबल का उपयोग करता है।

  • पहला फ़ंक्शन, मैप () फ़ंक्शन ऑब्जर्वेबल का उपयोग करता है, इसे प्रोसेस करता है, संसाधित ऑब्जर्वेबल को पाइप पर वापस लौटाता है () फ़ंक्शन,

  • उसके बाद जो संसाधित ऑब्जर्वेबल अगले फ़ंक्शन को दिया जाता है यदि कोई हो,

  • और यह इस तरह से चलता है कि जब तक सभी कार्यों को देखने योग्य प्रक्रिया नहीं होती है,

  • अंत में जो अवलोकन योग्य है वह पाइप () फ़ंक्शन द्वारा एक चर में लौटाया जाता है, निम्नलिखित उदाहरण में।

अब ऑब्जर्वेबल में बात यह है कि जब तक पर्यवेक्षक ने इसे सदस्यता नहीं दी है, तब तक यह किसी भी मूल्य का उत्सर्जन नहीं करता है। इसलिए मैंने इस ऑब्जर्वबल को सब्सक्राइब करने के लिए सब्सक्रिप्शन () फंक्शन का इस्तेमाल किया, फिर जैसे ही मैंने इसे सब्सक्राइब किया। इन () फ़ंक्शन मानों का उत्सर्जन करना शुरू करता है, फिर उन्हें पाइप () फ़ंक्शन के माध्यम से संसाधित किया जाता है, और आपको अंतिम परिणाम मिलता है, उदाहरण के लिए 1 () फ़ंक्शन से लिया जाता है, 1 मैप में 1 जोड़ा जाता है () फ़ंक्शन, और वापस लौट आया। आप सदस्यता (फ़ंक्शन ( तर्क ) {}) फ़ंक्शन के अंदर एक तर्क के रूप में उस मूल्य को प्राप्त कर सकते हैं ।

यदि आप इसे प्रिंट करना चाहते हैं, तो के रूप में उपयोग करता है

subscribe( function (argument) {
    console.log(argument)
   } 
)
    import { Component, OnInit } from '@angular/core';
    import { pipe } from 'rxjs';
    import { Observable, of } from 'rxjs';
    import { map } from 'rxjs/operators';
    
    @Component({
      selector: 'my-app',
      templateUrl: './app.component.html',
      styleUrls: [ './app.component.css' ]
    })
    export class AppComponent implements OnInit  {
    
      obs = of(1,2,3).pipe(
      map(x => x + 1),
      ); 
    
      constructor() { }
    
      ngOnInit(){  
        this.obs.subscribe(value => console.log(value))
      }
    }

https://stackblitz.com/edit/angular-ivy-plifkg

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.