আরএক্সজেএসে পাইপ কী


104

আমি মনে করি আমার কাছে বেস ধারণাটি রয়েছে তবে কিছু অস্পষ্টতা রয়েছে

সুতরাং সাধারণভাবে আমি এটি একটি পর্যবেক্ষণযোগ্য ব্যবহার করি:

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. এই ফাংশনগুলিতে কেন বিভিন্ন আমদানির প্রয়োজন?

4
আমি বলছিলাম যে এটি কাস্টম, অ-নেটিভ, অপারেটরদের জন্য, তবে আমি এটিও ঠিক জানি না। নেই pipe()আপনি অপারেটার যা আপনি তৈরি পাস?
শূন্য 298

উত্তর:


69

"পাইপযোগ্য" (প্রাক্তন "লেটেটেবল") অপারেটরগুলি আরএক্সজেএস 5.5 থেকে অপারেটরগুলি ব্যবহারের বর্তমান এবং প্রস্তাবিত উপায়

আমি আপনাকে দৃ strongly়ভাবে অফিসিয়াল ডকুমেন্টেশন https://rxjs.dev/guide/v6/pipeable-operators পড়ার জন্য সুপারিশ করছি

মূল পার্থক্য হ'ল কাস্টম অপারেটরগুলি তৈরি করা আরও সহজ এবং এটি এমন কোনও বিশ্বব্যাপী Observableবস্তুতে পরিবর্তন না করা যখন এটি দুটি ভিন্ন পক্ষ একই নামের অপারেটর তৈরি করতে চায় তবে এটি সংঘর্ষ তৈরি করতে পারে better

importপ্রতিটি অপারেটরের জন্য পৃথক স্টেটমেন্ট ব্যবহার করা 'rxjs/add/operator/first'ছোট অ্যাপ্লিকেশন বান্ডিলগুলি তৈরি করার একটি উপায় ছিল। পুরো আরএক্সজেএস লাইব্রেরির পরিবর্তে কেবল অপারেটরগুলি আমদানি করে আপনি মোট বান্ডিলের আকার উল্লেখযোগ্যভাবে হ্রাস করতে পারবেন। তবে সংকলকটি আপনি আমদানি করে কিনা তা জানতে পারবেন না 'rxjs/add/operator/first'কারণ আপনার কোডটিতে আপনার এটির সত্যই প্রয়োজন ছিল বা আপনার কোডটি পুনরায় ব্যবহার করার সময় আপনি কেবল এটি সরিয়ে দিতে ভুলে গিয়েছিলেন। পাইপযোগ্য অপারেটরগুলি ব্যবহারের এটি অন্যতম সুবিধা যেখানে অব্যবহৃত আমদানি স্বয়ংক্রিয়ভাবে উপেক্ষা করা হয়।


4
আপনার এফার্মেশন সম্পর্কে unused imports are ignored automatically, বর্তমানে আইডিইগুলিতে প্লাগইন রয়েছে যা অব্যবহৃত আমদানি সরিয়ে দেয়।
সিলভ্যানসানো

প্রত্যেকে এই আইডিই বা এই প্লাগইনগুলি ব্যবহার করছে না, অনেকেই বেসিক পাঠ্য সম্পাদক ব্যবহার করেন। সম্ভবত বেশিরভাগ সময় আমরা এই বিবৃতিতে রিলে করতে পারি না যে দলের প্রত্যেকটি একই আইডিই / প্লাগইন সেট / পাঠ্য সম্পাদক হিসাবে আমাদের ব্যবহার করছে।
অ্যাডাম ফারিনা

4
@ অ্যাডামফারিণা নিশ্চিত, কিছু দল কাগজে কোডও লিখতে পারে, তবে তাদের কাছে যদি আধুনিক সরঞ্জাম উপলব্ধ থাকে তবে তারা কেন করবে? কোনও পাঠ্য সম্পাদক ব্যবহার করা, বিশেষত গুরুত্বপূর্ণ প্লাগইনগুলি ছাড়া কাগজে লিখিত কোডের অনুরূপ। আপনি এটি করতে পারেন তবে কেন কোনও শালীন দল / বিকাশকারী তা করতে পারে
ডেনস প্যাপ

@DenesPapp কোড সম্পাদক যতক্ষণ না লোকে উত্পাদনশীল উপায়ে এটি ব্যবহার করতে পারে তাতে কিছু আসে যায় না। তা ছাড়া এটি কেবল ব্যক্তিগত পছন্দ। কাগজে কোড লেখার সাথে আপনার সাদৃশ্যটি সঠিক নয়, আপনি কাগজে কোড চালনা করতে পারবেন না তবে কোনও পাঠ্য সম্পাদককে লিখিত কোডটি কার্যকর করা যেতে পারে।
আদম ফারিনা

4
@ এপিরিয়ামন আপনি পারবেন তবে আপনার rxjs-compatপ্যাকেজটি ইনস্টল করতে হবে github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/v6/…
মার্টিন

16

পাইপ পদ্ধতি

মূল ডকুমেন্টেশন অনুযায়ী

পাইপযোগ্য অপারেটরটি হ'ল ফাংশনটি পর্যবেক্ষণগুলিকে একটি ইনপুট হিসাবে গ্রহণ করে এবং এটি অন্য পর্যবেক্ষণযোগ্য করে দেয় pre

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

@ ভ্লাদকুটস কোডগুলি এবং প্রদত্ত বৈশিষ্ট্যগুলি পরিবর্তন করে। অসুবিধার জন্য দুঃখিত।
চাণাকা ওয়েড়সিংহে

আপনাকে ধন্যবাদ, আমি বুঝতে পারি না যে আমি পাইপ-সক্ষম অপারেটরগুলিকে ফাংশন রেফারেন্স হিসাবে সঞ্চয় করতে পারি এবং পাইপ () কলটিতে সেগুলি ব্যবহার করতে পারি। এটি সবসময় ইনলাইন করার চেয়ে অনেক ক্লিনার।
অ্যালেক্স এ

9

একটি ভাল সংক্ষিপ্তসার আমি নিয়ে এসেছি:

এটি মূল কার্যকারিতা (সাবস্ক্রাইব, পাইপিং) থেকে স্ট্রিমিং অপারেশনগুলিকে (মানচিত্র, ফিল্টার, হ্রাস ...) ডিউপুল করে। শৃঙ্খলার বদলে পাইপিং ক্রিয়াকলাপগুলি, পর্যবেক্ষণের প্রোটোটাইপটিকে দূষিত করে না যা গাছ কাঁপানো সহজ করে তোলে।

Https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md# কেন দেখুন

বিন্দু-শৃঙ্খলার জন্য প্যাচযুক্ত অপারেটরগুলির সাথে সমস্যাগুলি হ'ল:

কোনও প্যাচ অপারেটর আমদানি করে এমন কোনও গ্রন্থাগার অন্ধ নির্ভরতা তৈরি করে of গ্রন্থাগারের সমস্ত গ্রাহকের জন্য পর্যবেক্ষণযোগ্য prপ্রোটোটাইপকে বাড়িয়ে তুলবে। লাইব্রেরি যদি তাদের ব্যবহার সরিয়ে দেয় তবে তারা অজান্তেই অন্য সকলকে ভেঙে দেয়। পাইপবেবলগুলি সহ, আপনাকে যে অপারেটরগুলির প্রয়োজন হবে সেগুলি প্রতিটি ফাইলগুলিতে ব্যবহার করতে হবে।

অপারেটররা সরাসরি প্রোটোটাইপে প্যাচ দেয় রোলআপ বা ওয়েবপ্যাকের মতো সরঞ্জাম দ্বারা "ট্রি-কাঁপানো" নয়। পাইপযোগ্য অপারেটরগুলি হ'ল তারা কেবল মডিউল থেকে সরাসরি টানা ফাংশন।

অ্যাপ্লিকেশনগুলিতে আমদানি করা হচ্ছে এমন অব্যবহৃত অপারেটরগুলি কোনও প্রকার বিল্ড টুলিং বা লিন্ট বিধি দ্বারা নির্ভরযোগ্যভাবে সনাক্ত করা যায় না। এর অর্থ হ'ল আপনি স্ক্যান আমদানি করতে পারেন তবে এটি ব্যবহার বন্ধ করুন এবং এটি আপনার আউটপুট বান্ডেলে যোগ করা হচ্ছে। পাইপযোগ্য অপারেটরগুলির সাথে, আপনি যদি এটি ব্যবহার না করেন তবে একটি লিন্টের নিয়ম এটি আপনার জন্য নিতে পারে।

কার্যকরী রচনা দুর্দান্ত। আপনার নিজস্ব কাস্টম অপারেটরগুলি তৈরি করা অনেক বেশি সহজ হয়ে যায় এবং এখন তারা কাজ করে এবং আরএক্সজেএস থেকে আসা সমস্ত অপারেটরের মতো দেখতে। আপনাকে আর পর্যবেক্ষণযোগ্য বা ওভাররাইড লিফ্ট বাড়ানোর দরকার নেই।


8

পার্থক্য কি? আপনি যেমন আপনার উদাহরণটিতে দেখেন, মূল পার্থক্য হ'ল উত্স কোডের পঠনযোগ্যতা উন্নত করা। আপনার উদাহরণে দুটি মাত্র ফাংশন রয়েছে, তবে ভাবুন তো সেখানে এক ডজন কাজ আছে? তারপর এটি যেতে হবে

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

এটি সত্যিই কুৎসিত হয়ে উঠছে, এবং পড়তে অসুবিধা হচ্ছে, বিশেষত যখন আপনি ক্রিয়াকলাপগুলি ভিতরে নিয়ে যাচ্ছেন। ভিজ্যুয়াল স্টুডিও কোডের মতো নির্দিষ্ট সম্পাদকগুলির উপরে 140 লাইনের দৈর্ঘ্যের বেশি অনুমতি দেয় না। তবে যদি এটি অনুসরণ করে চলে যায়।

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

এটি মারাত্মকভাবে পাঠযোগ্যতার উন্নতি করে improves

যদি কোনও পার্থক্য না থাকে তবে ফাংশন পাইপটি কেন বিদ্যমান? পিআইপিই () ফাংশনটির উদ্দেশ্য হ'ল সমস্ত ফাংশন একসাথে করা এবং পর্যবেক্ষণযোগ্য ফিরে আসা। এটি প্রাথমিকভাবে একটি পর্যবেক্ষণযোগ্য লাগে, তারপরে যে পর্যবেক্ষণযোগ্য তার ভিতরে ব্যবহৃত প্রতিটি ফাংশন দ্বারা পাইপ () ফাংশন জুড়ে ব্যবহৃত হয়।

প্রথম ফাংশন পর্যবেক্ষণযোগ্য গ্রহণ করে, এটি প্রক্রিয়া করে, এর মানটি পরিবর্তন করে এবং পরবর্তী ফাংশনে চলে যায়, তারপরে পরবর্তী ফাংশনটি প্রথম ফাংশনের পর্যবেক্ষণযোগ্য আউটপুট নেয়, এটি প্রক্রিয়া করে এবং পরবর্তী ফাংশনে চলে যায়, তারপরে এটি সমস্ত ফাংশন অবধি চলে পাইপের () ফাংশনের অভ্যন্তরে সেই পর্যবেক্ষণযোগ্য ব্যবহার করুন, অবশেষে আপনার পর্যবেক্ষণযোগ্য প্রক্রিয়াজাতকরণ হবে। এর শেষে আপনি মানটি বের করার জন্য সাবস্ক্রাইব () ফাংশন সহ পর্যবেক্ষণযোগ্য কার্যকর করতে পারেন। মনে রাখবেন, মূল পর্যবেক্ষণে মানগুলি পরিবর্তন হয় না !! 

এই ফাংশনগুলিতে কেন বিভিন্ন আমদানির প্রয়োজন? আমদানি নির্ভর করে যেখানে ফাংশনটি আরএক্সজেস প্যাকেজে নির্দিষ্ট করা আছে তার উপর। এটা এইভাবেই চলে. সমস্ত মডিউল কৌনিক মধ্যে নোড_মডিউল ফোল্ডারে সংরক্ষণ করা হয়। "মডিউল" থেকে {শ্রেণি import আমদানি করুন;

নীচের কোডটি উদাহরণ হিসাবে নেওয়া যাক। আমি এটি কেবল স্ট্যাকব্লিটজে লিখেছি। সুতরাং কিছুই স্বয়ংক্রিয়ভাবে উত্পন্ন হয় না, বা অন্য কোথাও থেকে অনুলিপি করা হয়। আপনি যখন গিয়ে পড়তে পারেন এবং rxjs ডকুমেন্টেশনে কী বলেছেন তা অনুলিপি করার বিষয়টি আমি দেখতে পাচ্ছি না। আমি ধরে নিয়েছি আপনি এখানে এই প্রশ্ন জিজ্ঞাসা করেছেন, কারণ আপনি ডকুমেন্টেশন বুঝতে পারেন নি। 

  • সম্পর্কিত মডিউলগুলি থেকে আমদানি করা পাইপ, পর্যবেক্ষণযোগ্য, মানচিত্রের ক্লাস রয়েছে। 
  • ক্লাসের মূল অংশে, পাইপে () ফাংশনটি কোডের মতো ব্যবহার করেছি। 
  • অফ () ফাংশনটি একটি পর্যবেক্ষণযোগ্যকে ফিরিয়ে দেয়, এটি সাবস্ক্রাইব করার সময় ক্রমসংখ্যায় নির্গত হয়।

  • পর্যবেক্ষণযোগ্য এখনও সাবস্ক্রাইব করা হয়নি।

  • আপনি যখন এটি পর্যবেক্ষণযোগ্য পাইপ () পছন্দ করেন তখন পাইপ () ফাংশন প্রদত্ত পর্যবেক্ষণযোগ্যকে একটি ইনপুট হিসাবে ব্যবহার করে।

  • প্রথম ফাংশন, মানচিত্র () ফাংশনটি পর্যবেক্ষণযোগ্য, এটি প্রক্রিয়াজাতকরণ, প্রক্রিয়াজাত পর্যবেক্ষণযোগ্যটিকে পাইপ () ফাংশনে ফিরিয়ে দেয়,

  • তারপরে সেই প্রক্রিয়াজাত পর্যবেক্ষণযোগ্যটি যদি সেখানে থাকে তবে পরবর্তী ক্রিয়ায় দেওয়া হবে,

  • এবং এটি এভাবে চলে যতক্ষণ না সমস্ত ফাংশন পর্যবেক্ষণযোগ্য প্রক্রিয়া করে,

  • শেষে যে পর্যবেক্ষণযোগ্যটি পাইপ () ফাংশন দ্বারা পরিবর্তনশীলতে ফিরে আসে, নিম্নলিখিত উদাহরণে এর obs হয়।

এখন পর্যবেক্ষণযোগ্য জিনিসটি হ'ল পর্যবেক্ষক যতক্ষণ না এটি সাবস্ক্রাইব করেন না ততক্ষণ এটি কোনও মূল্য নির্গত করে না। সুতরাং আমি এই পর্যবেক্ষণযোগ্যতে সাবস্ক্রাইব করার জন্য সাবস্ক্রাইব () ফাংশনটি ব্যবহার করেছি, তারপরেই আমি এটি সাবস্ক্রাইব করার সাথে সাথেই। () ফাংশনটি নির্গমন মানগুলি শুরু করে, তারপরে সেগুলি পাইপ () ফাংশনের মাধ্যমে প্রসেস করা হয় এবং আপনি শেষ পর্যন্ত চূড়ান্ত ফলাফল পাবেন, উদাহরণস্বরূপ 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.