আরএক্সজেজে কখন অবজারভেবল () ব্যবহার করবেন?


88

আমি ভাবছি এর ব্যবহার কী asObservable:

ডক্স অনুসারে:

একটি পর্যবেক্ষণযোগ্য ক্রম যা উত্স ক্রমের পরিচয় গোপন করে।

তবে কেন আপনার ক্রমটি লুকিয়ে রাখা দরকার?

উত্তর:


189

সাবজেক্ট.প্রোটোটাইপ.অ্যাসবারভেবল () কখন ব্যবহার করবেন

এর উদ্দেশ্য হ'ল এপিআইয়ের বাইরে সাবজেক্টের "পর্যবেক্ষক পক্ষ" ফাঁসানো রোধ করা। মূলত কোনও ফাঁসী বিমূর্ততা রোধ করতে যখন আপনি চান না যে লোকেরা ফলাফল পর্যবেক্ষণে "পরবর্তী" করতে সক্ষম হবে।

উদাহরণ

(দ্রষ্টব্য: এটি কীভাবে আপনার যেমন কোনও ডেটা উত্সকে পর্যবেক্ষণযোগ্য হিসাবে তৈরি করা উচিত তা নয়, পরিবর্তে আপনার new Observableনির্মাণকারী ব্যবহার করা উচিত , নীচে দেখুন)।

const myAPI = {
  getData: () => {
    const subject = new Subject();
    const source = new SomeWeirdDataSource();
    source.onMessage = (data) => subject.next({ type: 'message', data });
    source.onOtherMessage = (data) => subject.next({ type: 'othermessage', data });
    return subject.asObservable();
  }
};

এখন যখন কেউ পর্যবেক্ষণযোগ্য ফলাফল পেয়েছেন myAPI.getData()তখন তারা ফলাফলটিকে nextমূল্য দিতে পারে না :

const result = myAPI.getData();
result.next('LOL hax!'); // throws an error because `next` doesn't exist

new Observable()যদিও আপনার সাধারণত ব্যবহার করা উচিত

উপরের উদাহরণে আমরা সম্ভবত এমন কিছু তৈরি করছি যা আমরা বোঝাতে চাইনি। এক জন্য, getData()বেশিরভাগ পর্যবেক্ষণযোগ্যদের মতো অলস নয়, এটি SomeWeirdDataSourceঅবিলম্বে অন্তর্নিহিত ডেটা উত্স তৈরি করতে চলেছে (এবং সম্ভবত কিছু পার্শ্ব প্রতিক্রিয়া)। এর অর্থ হ'ল যদি আপনি retryবা repeatফলস্বরূপ পর্যবেক্ষণযোগ্য হয় তবে এটি আপনার ভাবার মতো কাজ করবে না।

আপনার যেমন পর্যবেক্ষণযোগ্য এর মধ্যে আপনার ডেটা উত্স তৈরির সজ্জিত করা ভাল:

const myAPI = {
  getData: () => return new Observable(subscriber => {
    const source = new SomeWeirdDataSource();
    source.onMessage = (data) => subscriber.next({ type: 'message', data });
    source.onOtherMessage = (data) => subscriber.next({ type: 'othermessage', data });
    return () => {
      // Even better, now we can tear down the data source for cancellation!
      source.destroy();
    };
  });
}

উপরের কোডের সাথে, এটিকে "অলস নয়" তৈরি করা সহ যে কোনও আচরণ RxJS এর ​​বিদ্যমান অপারেটরগুলি ব্যবহার করে পর্যবেক্ষণযোগ্যদের শীর্ষে রচনা করা যেতে পারে।


4
টিএক্স বেন ... আপনার স্টাফ অনুসরণ করছে ... আরএক্স
টিএক্স

4
@ শারদুল ... আপনি সাবস্ক্রাইব করতে চান:result.subscribe(value => doSomething(value))
বেন লেশ

4
@ বেনতালিডোরোস হ্যাঁ, প্রতিবার আপনি return subject.asObservable();এটি একটি নতুন পর্যবেক্ষণযোগ্য হবে। আপনার একক সাবজেক্ট সদস্য ভেরিয়েবল রয়েছে, এবং onMessage / onOथरMessage একটি শর্তে বা প্রারম্ভিককরণে (প্রতিটি কল নয়) ঘোষণা করা হবে। আমি সেই পদ্ধতির ব্যবহার করেছি pipe( filter() ), getData()ফাংশনে সরবরাহিত প্যারামিটারের উপর ভিত্তি করে । দি
ড্রেনাই

4
@ বেনল্যাশ, আপনার দ্বিতীয় কোডের নমুনা হওয়ার subjectকথা subscriber?
ফ্লোরিন ডি

4
আমি এখানে যাচাইকরণও চাই: subject.nextলাইনগুলি হওয়া উচিত subscriber। এছাড়াও, "যদি আপনি ফলাফলটি পর্যবেক্ষণযোগ্য পুনরায় চেষ্টা করেন বা পুনরায় পুনরায় চেষ্টা করেন, তবে এটি আপনার মনে হয় এমনটি কার্যকর হবে না" " আপনি আরো নির্দিষ্ট হতে পারে? আপনি কি বলতে চাইছেন new SomeWeirdDataSource()প্রতিবারই ঘটতে চলেছে getDataতাকে বলা হয় এবং এটি মোড়ানো দ্বারা new Observableইনস্ট্যান্টেশনটি সাবস্ক্রিপশন পর্যন্ত অপেক্ষা করে। আমি দেখতে পাচ্ছি না যখন আপনি কল করবে getDataএকটি ছাড়া .subscribeতাই আমি মান সেখানে অনুপস্থিত করছি। অবশেষে, "ডেটা উত্স ছিঁড়ে ফেলতে" আপনি কী হওয়ার পূর্বাভাস দিয়েছিলেন? ধন্যবাদ
1252748

7

Subjectএকটি observerএবং উভয় হিসাবে অভিনয় করতে পারে observable

একটি Obervable2 পদ্ধতি আছে।

  • সাবস্ক্রাইব
  • সাবস্ক্রাইব করুন

আপনি যখনই কোনওতে সাবস্ক্রাইব করেন observable, আপনি observerতার পরবর্তী , ত্রুটি এবং এতে সম্পূর্ণ পদ্ধতি রয়েছে এমন একটি পান।

আপনার ক্রমটি লুকিয়ে রাখতে হবে কারণ আপনি চান না যে স্ট্রিম উত্সটি প্রতিটি উপাদানগুলিতে সর্বজনীনভাবে উপলভ্য হোক। আপনি @BenLeshএকই জন্য উদাহরণস্বরূপ উল্লেখ করতে পারেন ।

PS: আমি যখন প্রথমবার প্রতিক্রিয়াশীল জাভাস্ক্রিপ্টের মাধ্যমে এসেছি তখন বুঝতে পারি না asObservable। কারণ আমাকে নিশ্চিত করতে হয়েছিল যে আমি বেসিকগুলি স্পষ্টভাবে বুঝতে পারি এবং তারপরেই যেতে পারি asObservable। :)

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