এককালীন সাবস্ক্রিপশন তৈরি করুন


179

আমাকে Observableপ্রথমে ডাকা হওয়ার সাথে সাথে তা নিষ্পত্তি করার জন্য আমার সাবস্ক্রিপশন তৈরি করতে হবে।

এখানে কি কিছু আছে:

observable.subscribeOnce(func);

আমার ব্যবহারের ক্ষেত্রে, আমি একটি এক্সপ্রেস রুট হ্যান্ডলারে একটি সাবস্ক্রিপশন তৈরি করছি এবং সাবস্ক্রিপশনটি অনুরোধ অনুযায়ী একাধিকবার কল করা হচ্ছে।

উত্তর:


317

আপনার যা প্রয়োজন তা সম্পর্কে 100% নির্দিষ্ট নয়, তবে আপনি যদি কেবল প্রথম মানটি পর্যবেক্ষণ করতে চান তবে হয় ব্যবহার করুন first()বা take(1):

observable.first().subscribe(func);

দ্রষ্টব্য: .take(1)এবং .first()উভয়ই যখন তাদের শর্তটি পূরণ হয় তখন স্বয়ংক্রিয়ভাবে সদস্যতা ত্যাগ করে

আরএক্সজেএস 5.5+ থেকে আপডেট

কোডার এর মন্তব্য থেকে ।

import { first } from 'rxjs/operators'

observable
  .pipe(first())
  .subscribe(func);

কারণটা এখানে


31
সাবস্ক্রিপশন পরে স্বয়ংক্রিয়ভাবে পরিষ্কার হয়ে যায়?
বার্কলে মার্টিনেজ

49
হ্যাঁ এটা করে. যখন তাদের শর্তটি পূরণ হয় তখন প্রথমে উভয় সদস্যতা ত্যাগ করুন।
ব্র্যান্ডন

20
দস্তাবেজ কেন বলছে না যে এটি স্বয়ংক্রিয়ভাবে সাবস্ক্রিপশনটি নিষ্পত্তি করে?
jzig

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

36
যদি 2018 এ যে কেউ আসছেন, আপনি আসলে চান observable.pipe(first()).subscribe(func), কোথা firstথেকে এসেছে rxjs/operators
কোডার

32

আরএক্সজেএস-এর কাছে আমার মধ্যে দেখা সেরা কয়েকটি দস্তাবেজ রয়েছে। বেলো লিঙ্কটি অনুসরণ করা আপনাকে অপারেটরদের কাছে অত্যন্ত সহায়ক টেবিল ম্যাপিং ব্যবহারের ক্ষেত্রে নিয়ে যাবে। উদাহরণস্বরূপ, অধীনে ব্যবহারের ক্ষেত্রে "আমি প্রথম মান নিতে চান" তিন অপারেটার আছেন: first, firstOrDefault, এবং sample

দ্রষ্টব্য, যদি পর্যবেক্ষণযোগ্য ক্রমটি কোনও বিজ্ঞপ্তি না দিয়ে সম্পূর্ণ করে, তবে firstঅপারেটর গ্রাহকদের একটি ত্রুটি সহ অবহিত করে যখন firstOrDefaultঅপারেটর গ্রাহকদের একটি ডিফল্ট মান সরবরাহ করে।

অপারেটর ব্যবহার কেস লুক


2

@ ব্র্যান্ডনের উত্তরের পরিপূরক হিসাবে তার ব্যবহারের ভিত্তিতে first()আপডেট করার জন্য বা এর মতো ব্যবহারও অপরিহার্য । উদাহরণস্বরূপ (অরক্ষিত):BehaviorSubjectObservable

var subject = new BehaviorSubject({1:'apple',2:'banana'});
var observable = subject.asObservable();

observable
  .pipe(
    first(), // <-- Ensures no stack overflow
    flatMap(function(obj) {
      obj[3] = 'pear';
      return of(obj);
    })
  )
  .subscribe(function(obj) {
    subject.next(obj);
  });

2

আপনি যদি কেবলমাত্র একবার পর্যবেক্ষণযোগ্যকে কল করতে চান তবে এর অর্থ আপনি এটি থেকে কোনও স্রোতের অপেক্ষা করতে যাচ্ছেন না। এর toPromise()পরিবর্তে ব্যবহার করা subscribe()আপনার ক্ষেত্রে যথেষ্ট হবে কারণ toPromise()সাবস্ক্রিপশনের প্রয়োজন নেই।


খুব আকর্ষণীয়, এটি অর্থ আমরা পারি শুধু তা এক মাছ ধরার নৌকা তোলেawaitpromise
লুই Almeda

@ লুইআলমেদা আপনি কি আমাদের একটি লাইনের উদাহরণ দিতে পারেন?
অ্যাডো রেন

হাই @ অ্যাডোরেন, আমি এখানে আপনার জন্য একটি উত্তরের কৌশলটি ব্যাখ্যা করেছি, আমি আশা করি এটি সাহায্য করবে।
লুই আলমেদা

2

পরিষ্কার এবং সুবিধাজনক সংস্করণ

পর্যবেক্ষণযোগ্যকে একটি প্রতিশ্রুতিতে রূপান্তরিত করতে এম ফুয়াত নুরোএলইউর আশ্চর্যজনক উত্তরটি প্রসারিত করার জন্য এটির খুব সুবিধাজনক সংস্করণ এখানে।

const value = await observable.toPromise();

console.log(value)

এর সৌন্দর্য হ'ল আমরা কোনও অন্য নেস্টেড ব্লকের পরিচয় না দিয়েই স্বাভাবিক মানের মতো সেই মানটি ব্যবহার করতে পারি!

এটি বিশেষত কার্যকর যখন আপনি একাধিক পর্যবেক্ষণযোগ্য থেকে একাধিক মান পেতে প্রয়োজন। পরিষ্কার এবং পরিচ্ছন্ন.

const content = await contentObservable.toPromise();
const isAuthenticated = await isAuthenticatedObservable.toPromise();

if(isAuthenticated){
   service.foo(content)
}

অবশ্যই, আপনি asyncযদি এই রুটটির সাথে যেতে চান তবে আপনাকে অবশ্যই আপনার সংযুক্ত ফাংশন তৈরি করতে হবে । আপনি .thenযদি কেবলমাত্র প্রতিশ্রুতিটি রাখতে চান না যদি আপনি না চান যে এই ফাংশনটি অ্যাসিঙ্ক হয়

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

পিএস যদি আপনি এই উত্তরটি পছন্দ করেন তবে এম ফুয়াত নুরওলু উত্তরটিও ভুল করতে ভুলবেন না :)


0

আমি একই প্রশ্ন ছিল।

নীচে পরে বিভিন্ন রাষ্ট্র পরিবর্তনকারীদের কাছ থেকেও ডাকা হয়েছিল। যেমন আমি চাইনি।

function foo() {
    // this was called many times which was not needed
    observable.subscribe(func);
    changeObservableState("new value");
}

আমি unsubscribe()নীচে সাবস্ক্রাইব করার চেষ্টা করার সিদ্ধান্ত নিয়েছে ।

function foo() {
    // this was called ONE TIME
    observable.subscribe(func).unsubscribe();
    changeObservableState("new value");
}

subscribe(func).unsubscribe();ভালো হয় subscribeOnce(func)

আমি আশা করি এটি আপনাকেও সহায়তা করেছে

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