সাবজেক্ট বনাম বিহেভিয়ারসুবজেক্ট বনাম রিপ্লেসউবজেক্ট কৌণিকের মধ্যে


122

আমি এই 3 বুঝতে চেষ্টা করছি:

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

তাহলে তাদের উদ্দেশ্য কী? একটি রিয়েল-ওয়ার্ল্ড কেস সবচেয়ে বেশি প্রশংসিত হবে এটি এমনকি কোডও করতে হবে না।

আমি কেবল "a + b => সি আপনি সাবস্ক্রাইব করেছেন ..." নয় একটি পরিষ্কার ব্যাখ্যা পছন্দ করব would

ধন্যবাদ


1
ইতিমধ্যে পর্যবেক্ষণযোগ্য সহ আচরণের বিষয় নিয়ে একটি প্রশ্ন রয়েছে; stackoverflow.com/questions/39494058/... এবং রিপ্লে বিষয়ে ডকুমেন্টেশন স্পষ্ট নিচ হয় github.com/Reactive-Extensions/RxJS/blob/master/doc/api/...
Eko

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

উত্তর:


277

এটি সত্যই আচরণ এবং শব্দার্থবিজ্ঞানের নেমে আসে। সঙ্গে একটি

  • Subject- একজন গ্রাহক কেবলমাত্র প্রকাশিত মানগুলি পাবেন যা সাবস্ক্রিপশনের পরে নির্গত হয়েছিল । নিজেকে জিজ্ঞাসা করুন, আপনি কি চান? গ্রাহকের কি পূর্ববর্তী মান সম্পর্কে কিছু জানা দরকার? যদি তা না হয় তবে আপনি এটি ব্যবহার করতে পারেন, অন্যথায় অন্যগুলির মধ্যে একটি চয়ন করুন। উদাহরণস্বরূপ, উপাদান-থেকে-উপাদান যোগাযোগের সাথে। বলুন যে আপনার কাছে এমন একটি উপাদান রয়েছে যা একটি বোতাম ক্লিকে অন্যান্য উপাদানগুলির জন্য ইভেন্টগুলি প্রকাশ করে। আপনি যোগাযোগের জন্য একটি বিষয় সহ একটি পরিষেবা ব্যবহার করতে পারেন।

  • BehaviorSubject- শেষ মানটি ক্যাশেড। একজন গ্রাহক প্রাথমিক সাবস্ক্রিপশনের পরে সর্বশেষতম মানটি পাবেন। এই বিষয়ের জন্য শব্দার্থবিজ্ঞান হ'ল সময়ের সাথে পরিবর্তিত একটি মান উপস্থাপন করা। যেমন একটি লগ ইন ব্যবহারকারী। প্রাথমিক ব্যবহারকারী কোনও বেনামে ব্যবহারকারী হতে পারে। কিন্তু একবার যখন কোনও ব্যবহারকারী লগ ইন করে, তারপরে নতুন মান হ'ল অনুমোদনপ্রাপ্ত ব্যবহারকারী রাষ্ট্র।

    BehaviorSubjectইনিশিয়াল মান সক্রিয়া করা হয়। পছন্দটি কোডিংয়ের ক্ষেত্রে এটি কখনও কখনও গুরুত্বপূর্ণ। উদাহরণস্বরূপ বলুন আপনি এটি দিয়ে একটি আরম্ভ করেন null। তারপরে আপনার সাবস্ক্রিপশনে আপনাকে একটি নাল চেক করতে হবে। হয়তো ঠিক আছে, বা বিরক্তিকর হতে পারে।

  • ReplaySubject- এটি নির্ধারিত সংখ্যার নির্গমন করতে পারে। যে কোনও গ্রাহক সাবস্ক্রিপশনের উপর ভিত্তি করে সমস্ত ক্যাশেড মান পাবেন। আপনার কখন এই আচরণের প্রয়োজন হবে? সত্যি বলতে, আমার নিম্নোক্ত মামলা ব্যতীত এ জাতীয় আচরণের কোনও প্রয়োজন নেই:

    আপনি যদি ReplaySubjectএকটি বাফার আকারের সাথে একটি সূচনা করেন 1, তবে এটি আসলে একটি এর মতো আচরণ করেBehaviorSubject । সর্বশেষ মানটি সর্বদা ক্যাশে থাকে, তাই এটি সময়ের সাথে সাথে মান পরিবর্তনের মতো কাজ করে। এটির সাথে আরম্ভের nullক্ষেত্রে ক এর সাথে চেকের দরকার নেই । এই উদাহরণস্বরূপ, গ্রাহকের কাছে প্রথম প্রকাশের আগে পর্যন্ত কোনও মান নির্গত হয় না।BehaviorSubjectnull

সুতরাং এটি আপনি যে আচরণটি প্রত্যাশা করছেন তা আসলেই নেমে আসবে (কোনটি ব্যবহার করবেন)। বেশিরভাগ সময় আপনি সম্ভবত একটি ব্যবহার করতে চান BehaviorSubjectকারণ আপনি যা সত্যই উপস্থাপন করতে চান সেটি হ'ল "সময়ের সাথে মান" শব্দার্থক। তবে আমি ব্যক্তিগতভাবে ReplaySubjectআরম্ভের বিকল্পের সাথে কোনও ভুল দেখছি না 1

আপনি যা এড়াতে চান তা হ'ল ভ্যানিলা ব্যবহার করা Subjectযখন আপনার যা প্রয়োজন তা হল কিছু ক্যাচিং আচরণ। উদাহরণস্বরূপ আপনি কোনও রাউটিং গার্ড বা একটি সমাধান লিখছেন Take আপনি সেই প্রহরীতে কিছু ডেটা আনেন এবং এটিকে কোনও পরিষেবায় সেট করেন Subject। তারপরে রাউটেড অংশে আপনি পরিষেবা বিষয়টিতে সাবস্ক্রাইব করে গার্ডে যে মানটি নির্গত হয়েছিল তা পাওয়ার চেষ্টা করুন। উফ। মান কোথায়? এটি ইতিমধ্যে নির্গত হয়েছিল, ডিইউএইচ। একটি "ক্যাচিং" বিষয় ব্যবহার করুন!

আরো দেখুন:


1
এটি সংক্ষিপ্ত এবং পার্থক্যগুলি বোঝা সহজ। যখন পরিষেবাতে মান পরিবর্তন হয় এবং উপাদানগুলিও পরিবর্তিত হয় যে মানটি প্রদর্শিত হয়, তখন বেহভিওরসুবজেক্টস বা রিপ্লে সাবজেক্টই সমাধান হয়।
সাইয়্যাফ ফারুক

1
ধন্যবাদ! ReplaySubject1 এর একটি বাফার আকারের সাথে আমার প্রয়োজনটি ঠিক ছিল। আমার কাছে একটি রুট গার্ড ছিল যার মান প্রয়োজন, তবে প্রথম নির্গমনের জন্য অপেক্ষা করা দরকার। সুতরাং একটি BehaviorSubjectএটি কাটছিল না, যেহেতু আমি প্রাথমিক মান চাই না ( nullএটি কোনও কাজ করবে না কারণ আমি এটি একটি রাষ্ট্রকে বোঝাতে ব্যবহার করছিলাম)
menehune23

1
@ menehune23 আমার একটি কৌণিক resolveগার্ড শ্রেণীর জন্যও রিপ্লেউউজব্যাক্টের দরকার ছিল । আমার ডেটা পরিষেবাটি অ্যাসিনক্রোনাস, বা সিঙ্ক্রোনাস হতে পারে (যদি ডেটা ইতিমধ্যে পুনরুদ্ধার করা হত)। যদি এটি সিঙ্ক্রোনাস হয় তবে সাবজেক্ট.এনেক্সট ()টি resolveফাংশনটি ফিরে আসার আগেই এবং বহির্মুখীভাবে কৌণিকতার দ্বারা সাবস্ক্রাইব হওয়ার আগে বরখাস্ত করা হয়েছিল । বেহিভিউর সাবজেক্টটি সম্ভবত কাজ করবে তবে প্রাথমিক মানের জন্য আমাকে স্পষ্টভাবে কল করতে হবে complete()এবং nullচেক যোগ করতে হবে। যা কাজ করেছে তা নতুন ছিল ReplaySubject<DataType>(1) এবংresolveSubject.asObservable().take(1).map(....)
ড্রেনাই

1
আমি 1 এর বাফার সাইজের সাথে একটি রিপ্লেসউবজেক্টটি ব্যবহার করছি তবে যখন আমি পর্যবেক্ষণযোগ্য একটি পর্যবেক্ষণযোগ্য হয়ে উঠি তখন কোনও কারণেই আমি আমার রিপ্লেসউজেক্টে ফোন করার আগে গ্রাহকদের .asObservable()একটি মান প্রেরণ nullকরি next()। আমি ভেবেছিলাম এটির আচরণের সাবজেক্টের মতো কোনও প্রাথমিক মান থাকার কথা নয়?
কাইল ভি।

2
আমি মনে করি আপনি রিপ্লে সাবজেক্টের জন্য উল্লেখ করতে পারেন এমন একটি সহজ উদাহরণ একটি "চ্যাটরুম" বা গেম লবি দৃশ্যের জন্য যেখানে আপনি নতুন যোগদানকারীদের শেষ 10 বার্তা দেখতে চান।
জেমস

15

বিভিন্ন পর্যবেক্ষণযোগ্য ধরনের একটি সহজ সারসংক্ষেপ, অ স্বজ্ঞাত নামকরণ আমি জানি

  • Subject - গ্রাহক কেবল সাবস্ক্রিপশন তৈরি হওয়ার পরে তার প্রকাশিত মান পাবে।
  • BehaviorSubject - নতুন গ্রাহকগণ সাবস্ক্রিপশনের সাথে সাথে সর্বশেষ প্রকাশিত মান বা প্রাথমিক মান পান।
  • ReplaySubject - নতুন গ্রাহকরা সাবস্ক্রিপশনের সাথে সাথে সমস্ত পূর্বে প্রকাশিত মান (গুলি) পান

1-এন প্রকাশিত মান? সুতরাং যদি 2 টি প্রকাশিত মান থাকে তবে একটি রিপ্লেসউবজেক্ট -1 প্রকাশিত মান উত্পাদন করতে পারে ???
জেসন চেং

@ জেসন চেং এটিকে সাবস্ক্রিপশন, আপডেটের উত্তর অনুসারে পূর্বের সমস্ত প্রকাশিত মান পুনরুদ্ধার করে না :)
রিকি বয়েস

11
  1. বিষয় : সাবস্ক্রাইব করার সময় এটি সর্বদা ডেটা পায় যা সাবস্ক্রিপশন হওয়ার পরে ধাক্কা দেয় অর্থাৎ পূর্ববর্তী ধাক্কা মানগুলি না পাওয়া যায়
const mySubject = new Rx.Subject();

mySubject.next(1);

const subscription1 = mySubject.subscribe(x => {
  console.log('From subscription 1:', x);
});

mySubject.next(2);

const subscription2 = mySubject.subscribe(x => {
  console.log('From subscription 2:', x);
});

mySubject.next(3);

subscription1.unsubscribe();

mySubject.next(4);

এই উদাহরণ সহ, এখানে ফলাফলটি কনসোলে মুদ্রিত হবে:

From subscription 1: 2
From subscription 1: 3
From subscription 2: 3
From subscription 2: 4

দেরীতে আসা সাবস্ক্রিপশন কীভাবে সাবজেক্টে চাপানো হয়েছে এমন কিছু ডেটা হারিয়ে যাচ্ছে তা নোট করুন।

  1. পুনরায় খেলুন বিষয়গুলি : পূর্বের মানগুলির একটি বাফার রেখে সাহায্য করতে পারে যা নতুন সাবস্ক্রিপশনে প্রস্থানিত হবে।

এখানে রিপ্লে বিষয়গুলির জন্য ব্যবহারের উদাহরণ রয়েছে যেখানে একটি buffer of 2 previous valuesনতুন সাবস্ক্রিপশনে রাখা হয় এবং নির্গত হয়:

const mySubject = new Rx.ReplaySubject(2);

mySubject.next(1);
mySubject.next(2);
mySubject.next(3);
mySubject.next(4);

mySubject.subscribe(x => {
  console.log('From 1st sub:', x);
});

mySubject.next(5);

mySubject.subscribe(x => {
  console.log('From 2nd sub:', x);
});

কনসোলে যা আমাদের দেয় তা এখানে:

From 1st sub: 3
From 1st sub: 4
From 1st sub: 5
From 2nd sub: 4
From 2nd sub: 5
  1. আচরণের বিষয়গুলি : রিপ্লে বিষয়গুলির সাথে সমান, তবে কেবলমাত্র সর্বশেষ নির্গত মান, বা কোনও মান পূর্বে নির্গত না হলে একটি ডিফল্ট মান পুনরায় নির্গত করবে:
const mySubject = new Rx.BehaviorSubject('Hey now!');

mySubject.subscribe(x => {
  console.log('From 1st sub:', x);
});

mySubject.next(5);

mySubject.subscribe(x => {
  console.log('From 2nd sub:', x);
});

এবং ফলাফল:

From 1st sub: Hey now!
From 1st sub: 5
From 2nd sub: 5

তথ্যসূত্র: https://alligator.io/rxjs/subjects/


4

থেকে: র্যান্ডাল কাউটনিক বই "আরএক্সজেএস সহ প্রতিক্রিয়াশীল ওয়েবসাইটগুলি তৈরি করুন"। :

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

ইতিহাস ট্র্যাক করতে আমরা রিপ্লেসউবজেক্টটি ব্যবহার করতে পারি । একটি রিপ্লেসউবজেক্ট সর্বশেষ এন ইভেন্টগুলি রেকর্ড করে এবং প্রতিটি নতুন গ্রাহকের কাছে ফিরে আসে। উদাহরণস্বরূপ চ্যাট অ্যাপ্লিকেশন। আমরা এটি আগের চ্যাট ইতিহাসের রেকর্ড ট্র্যাকিংয়ের জন্য ব্যবহার করতে পারি।

একজন BehaviorSubject একটি সরলীকৃত সংস্করণ ReplaySubjectReplaySubject সঞ্চিত ঘটনা একটি অবাধ নম্বর, BehaviorSubject শুধুমাত্র সর্বশেষ ঘটনা মান রেকর্ড করে। যখনই কোনো BehaviorSubject একটি নতুন সাবস্ক্রিপশন রেকর্ড, এটা গ্রাহক সর্বশেষ মান সেইসাথে নতুন মান গৃহীত হয় যে ইন নির্গত। দ্য BehaviorSubject দরকারী যখন যেমন কনফিগারেশন অপশন যেমন রাষ্ট্রের একক ইউনিট, সঙ্গে তার আচরণ।


1

সর্বাধিক উত্সাহিত উত্তর স্পষ্টতই ভুল দাবি করে যে:

"আপনি যদি ReplaySubject1 টি বাফার আকারের সাথে একটি সূচনা করেন তবে এটি আসলে একটির মতো আচরণ করে BehaviorSubject"


এটি সম্পূর্ণ সত্য নয়; পরীক্ষা এই মহান ব্লগ পোস্টে যারা দুই মধ্যে পার্থক্য করেন। উদাহরণস্বরূপ BehaviorSubject, আপনি যদি একটি সম্পন্ন হয়ে সাবস্ক্রাইব করেন তবে আপনি সর্বশেষ মান পাবেন না তবে একটির জন্য ReplaySubject(1)আপনি সর্বশেষ মান পাবেন।

এটি গুরুত্বপূর্ণ পার্থক্য যা উপেক্ষা করা উচিত নয়:

const behavior = new BehaviorSubject(null);
const replay = new ReplaySubject(1);

behavior.skip(1).subscribe(v => console.log('BehaviorSubject:', v));
replay.subscribe(v => console.log('ReplaySubject:', v));

behavior.next(1);
behavior.next(2);
behavior.complete();
behavior.subscribe(v => console.log('Late B subscriber:', v));

replay.next(1);
replay.next(2);
replay.complete();
replay.subscribe(v => console.log('Late R subscriber:', v));

এই কোডের উদাহরণটি এখানে দেখুন যা এই বিষয়ের উপরে আরও একটি দুর্দান্ত ব্লগ পোস্ট থেকে এসেছে ।


0
     // ***********Subject  concept ***********
    let subject = new Subject<string>();


    subject.next("Eureka");
    subject.subscribe((data) => {
      console.log("Subscriber 1 got data >>>>> "+ data);
    });
    subject.subscribe((data) => {
      console.log("Subscriber 2 got data >>>>> "+ data);
    });

       // ********behaviour subject*********
    // Behavior subjects need a first value
let subject1 = new BehaviorSubject<string>("First value");


subject1.asObservable().subscribe((data) => {
  console.log("First subscriber got data behaviour subject>>>>> "+ data);
});
subject1.next("Second value")
  • বিষয় - সাবস্ক্রিপশন তৈরি হওয়ার পরে কোনও গ্রাহক কেবলমাত্র প্রকাশিত মান পাবেন।
  • আচরণ-সাবজেক্ট - নতুন গ্রাহকগণ সাবস্ক্রিপশনের পরে অবিলম্বে সর্বশেষ প্রকাশিত মান বা প্রাথমিক মান পান।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.