--- সম্পাদনা 4 - অতিরিক্ত সংস্থানসমূহ (2018/09/01)
অ্যাঙ্গুলার ইন অ্যাডভেঞ্চারস এর সাম্প্রতিক পর্বে অ্যাঙ্কুলার বেন লেশ এবং ওয়ার্ড বেল কোনও / কোনও উপাদানকে কীভাবে / কখন সাবস্ক্রাইব করবেন তা প্রায় বিষয়গুলি নিয়ে আলোচনা করুন। আলোচনাটি প্রায় 1:05:30 এ শুরু হয়।
ওয়ার্ড উল্লেখ right now there's an awful takeUntil dance that takes a lot of machinery
এবং শাই রেজনিক উল্লেখ Angular handles some of the subscriptions like http and routing
।
প্রতিক্রিয়া হিসাবে বেন উল্লেখ করেছেন যে এখনই অবজারভেলসকে কৌণিক উপাদান লাইফসাইकल ইভেন্টগুলিতে প্রবেশ করার অনুমতি দেওয়ার জন্য আলোচনা করা হয়েছে এবং ওয়ার্ড প্রস্তাবিত জীবনচক্রের একটি পর্যবেক্ষণযোগ্য পরামর্শ দেয় যে কোনও উপাদান উপাদান অভ্যন্তরীণ রাষ্ট্র হিসাবে রক্ষণাবেক্ষণের জন্য কখন সম্পূর্ণ করতে পারে তা জানার উপায় হিসাবে সাবস্ক্রাইব করতে পারে।
এটি বলেছিল, আমাদের এখন বেশিরভাগ সমাধান প্রয়োজন তাই এখানে অন্যান্য কিছু সংস্থান রয়েছে।
takeUntil()
আরএক্সজেএসের মূল দলের সদস্য নিকোলাস জ্যামিসন থেকে প্যাটার্নের জন্য একটি সুপারিশ এবং এটি প্রয়োগে সহায়তা করার জন্য একটি tslint নিয়ম। https://ncjamieson.com/avoiding-takeuntil-leaks/
লাইটওয়েট এনপিএম প্যাকেজ যা পর্যবেক্ষণযোগ্য অপারেটরটিকে বহন করে যা this
পরামিতি হিসাবে কোনও উপাদান উদাহরণ ( ) গ্রহণ করে এবং স্বয়ংক্রিয়ভাবে সাবস্ক্রাইব করার সময় ngOnDestroy
।
https://github.com/NetanelBasal/ngx-take-until-destroy
আপনি যদি এওটি বিল্ড না করে থাকেন তবে কিছুটা ভাল এরগনমিকসের সাথে উপরের আরও একটি প্রকরণ (তবে আমাদের সবার এখনই এওটি করা উচিত)।
https://github.com/smnbbrv/ngx-rx-collector
কাস্টম দিকনির্দেশনা *ngSubscribe
যা অ্যাসিঙ্ক পাইপের মতো কাজ করে তবে আপনার টেমপ্লেটে এম্বেডড ভিউ তৈরি করে যাতে আপনি আপনার টেমপ্লেট জুড়ে 'মোড়ানো' মানটি উল্লেখ করতে পারেন।
https://netbasal.com/diy-subscription-handling-directive-in-angular-c8f6e762697f
আমি নিকোলাসের ব্লগে একটি মন্তব্যে উল্লেখ করেছি যে অতিরিক্ত ব্যবহারের ফলে takeUntil()
আপনার উপাদানটি খুব বেশি চেষ্টা করার চেষ্টা করছে এবং আপনার বিদ্যমান উপাদানগুলিকে বৈশিষ্ট্য এবং উপস্থাপক উপাদানগুলিতে পৃথক করার বিষয়টি বিবেচনা করা উচিত sign তারপরে আপনি | async
বৈশিষ্ট্য উপাদানটি থেকে Input
উপস্থাপক উপাদানগুলির একটিতে পর্যবেক্ষণযোগ্য করতে পারবেন , যার অর্থ কোথাও কোনও সদস্যতার প্রয়োজন নেই necessary এখানে এই পদ্ধতির সম্পর্কে আরও পড়ুন
--- সম্পাদনা 3 - 'অফিসিয়াল' সমাধান (2017/04/09)
আমি এনজিওনফ এ ওয়ার্ড বেলের সাথে এই প্রশ্নটি সম্পর্কে কথা বলেছি (এমনকি আমি তাকে এই উত্তরটিও দেখিয়েছিলাম যা তিনি সঠিক বলেছিলেন) তবে তিনি আমাকে বলেছিলেন যে অ্যাঙ্গুলারের জন্য ডক্স দলটির এই প্রশ্নের একটি সমাধান রয়েছে যা অপ্রকাশিত (যদিও তারা এটি অনুমোদনে কাজ করছে) )। তিনি আমাকে আরও বলেছিলেন যে আমি আসন্ন আধিকারিকের সুপারিশ সহ আমার এসও উত্তর আপডেট করতে পারি।
সমাধান আমরা সবাই ব্যবহার এগিয়ে নিয়ে যাওয়া উচিত যোগ হয় private ngUnsubscribe = new Subject();
সব উপাদান আছে যে ক্ষেত্র .subscribe()
কল Observable
তাদের শ্রেণীর সংকেত মধ্যে গুলি।
তারপরে আমরা this.ngUnsubscribe.next(); this.ngUnsubscribe.complete();
আমাদের ngOnDestroy()
পদ্ধতিগুলিতে কল করি ।
সিক্রেট সস (যেমন ইতিমধ্যে @metamaker দ্বারা উল্লিখিত ) takeUntil(this.ngUnsubscribe)
আমাদের .subscribe()
কলগুলির আগে কল করা যা যা উপাদানটি ধ্বংস হয়ে গেলে সমস্ত সাবস্ক্রিপশন পরিষ্কার হয়ে যাওয়ার নিশ্চয়তা দেয় will
উদাহরণ:
import { Component, OnDestroy, OnInit } from '@angular/core';
// RxJs 6.x+ import paths
import { filter, startWith, takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { BookService } from '../books.service';
@Component({
selector: 'app-books',
templateUrl: './books.component.html'
})
export class BooksComponent implements OnDestroy, OnInit {
private ngUnsubscribe = new Subject();
constructor(private booksService: BookService) { }
ngOnInit() {
this.booksService.getBooks()
.pipe(
startWith([]),
filter(books => books.length > 0),
takeUntil(this.ngUnsubscribe)
)
.subscribe(books => console.log(books));
this.booksService.getArchivedBooks()
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe(archivedBooks => console.log(archivedBooks));
}
ngOnDestroy() {
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
}
দ্রষ্টব্য:takeUntil
অপারেটর চেইনে অন্তর্বর্তী পর্যবেক্ষণযোগ্যদের সাথে ফাঁস রোধ করতে সর্বশেষ হিসাবে অপারেটরটি যুক্ত করা গুরুত্বপূর্ণ ।
--- সম্পাদনা 2 (2016/12/28)
সূত্র 5
কৌণিক টিউটোরিয়াল, রাউটিং অধ্যায়টি এখন নিম্নলিখিতটি জানিয়েছে: "রাউটারটি সাবস্ক্রিপশনগুলি সরবরাহ করে এবং স্থানীয়করণ করে এমন পর্যবেক্ষণগুলি পরিচালনা করে the উপাদানটি ধ্বংস হয়ে গেলে, সাবস্ক্রিপশনগুলি পরিষ্কার হয়ে যায়, মেমরি ফাঁস থেকে রক্ষা করে, সুতরাং আমাদের থেকে সাবস্ক্রাইব করার দরকার নেই from রুট পর্যবেক্ষণযোগ্য প্যারাম। " - মার্ক রাজকক
রাউটার অবজারভেবলস সম্পর্কিত অ্যাংুলার ডক্সের জন্য গিথুব ইস্যু নিয়ে এখানে আলোচনা হয়েছে যেখানে ওয়ার্ড বেল উল্লেখ করেছেন যে এই সমস্তটির জন্য স্পষ্টকরণ কাজ চলছে।
--- সম্পাদনা করুন 1
সূত্র 4
এনজিওরোপ রব ওয়ার্মল্ডের এই ভিডিওতে এও বলেছেন যে রাউটার অবজারভেজেবল থেকে আপনাকে সদস্যতা ছাড়ার দরকার নেই। তিনি http
পরিষেবাটি এবং ActivatedRoute.params
এই ভিডিওতে নভেম্বর 2016 থেকে উল্লেখ করেছেন ।
--- আসল উত্তর
TLDR:
এই প্রশ্নের জন্য (2) ধরণের রয়েছে Observables
- সীমাবদ্ধ মান এবং অসীম মান।
http
Observables
সীমাবদ্ধ (1) মান এবং একটি ডোমের মতো কিছু উত্পাদন করেevent listener
Observables
উত্পাদন অসীম মান।
আপনি যদি ম্যানুয়ালি কল করেন subscribe
(async পাইপ ব্যবহার করছেন না), তবেunsubscribe
অনন্ত থেকে Observables
।
চিন্তা করবেন না সসীম , RxJs
তাদের যত্ন নেবেন।
সূত্র ঘ
আমি অ্যাংুলার গিটারে রব ওয়ার্মল্ডের একটি উত্তর সন্ধান করেছি এখানে ।
তিনি বলেছেন (আমি স্বচ্ছতার জন্য পুনর্গঠিত এবং জোর আমার)
যদি এটির একটি একক-মান-সিকোয়েন্স (কোনও HTTP অনুরোধের মতো) হয় ম্যানুয়াল ক্লিনআপ অপ্রয়োজনীয় (ধরে নিলে আপনি নিজেই নিয়ামকটিতে সাবস্ক্রাইব করে ধরেছেন)
আমার বলা উচিত "যদি এটি একটি ক্রম সম্পূর্ণ করে " (যার মধ্যে একক মান সিক্যোয়েন্সগুলি, একটি লা HT, একটি)
যদি তার অসীম অনুক্রম , আপনি সদস্যতামুক্ত উচিত যা ASYNC নল তোমার জন্য না
এছাড়াও তিনি এই ইউটিউব ভিডিওতে পর্যবেক্ষণে উল্লেখ করেছেন যে they clean up after themselves
... পর্যবেক্ষণের প্রসঙ্গে যে complete
(প্রতিশ্রুতিগুলির মতো, যা সর্বদা পূর্ণ হয় কারণ তারা সর্বদা 1 মান উত্পাদন করে এবং শেষ হয় - আমরা কখনই xhr
ইভেন্টটি সাফ না করে তা নিশ্চিত করার প্রতিশ্রুতি থেকে সদস্যতা নিয়ে উদ্বিগ্ন হইনি) শ্রোতা, ঠিক আছে?)।
উত্স 2
এছাড়াও কৌনিক 2 এর রঙিন গাইডে এটি পড়ে
বেশিরভাগ ক্ষেত্রে আমাদের স্পষ্টতই সাবস্ক্রাইব পদ্ধতিটি কল করার দরকার নেই যতক্ষণ না আমরা তাড়াতাড়ি বাতিল করতে চাই বা আমাদের পর্যবেক্ষণযোগ্যটির সাবস্ক্রিপশনের চেয়ে দীর্ঘতর জীবনকাল না থাকে। পর্যবেক্ষণযোগ্য অপারেটরগুলির ডিফল্ট আচরণ হ'ল। কমপ্লিট () বা .error () বার্তা প্রকাশিত হওয়ার সাথে সাথেই সাবস্ক্রিপশনটি নিষ্পত্তি করা। মনে রাখবেন যে আরএক্সজেএস বেশিরভাগ সময় "ফায়ার এন্ড ভুলে" ফ্যাশনে ব্যবহারের জন্য ডিজাইন করা হয়েছিল।
কথাটি কখন our Observable has a longer lifespan than our subscription
প্রয়োগ হয়?
এটি প্রয়োগ হয় যখন কোনও সাবস্ক্রিপশন কোনও উপাদানটির ভিতরে তৈরি করা হয় যা সম্পূর্ণ হওয়ার আগে (বা 'দীর্ঘ' না আগে) ধ্বংস হয়ে যায় Observable
।
আমি এটি অর্থ হিসাবে পড়ি যদি আমরা একটি http
অনুরোধ বা সাবস্ক্রাইব করে সাবস্ক্রাইব করি যা 10 টি মান নির্গত করে এবং আমাদের http
অনুরোধটি অনুরোধটি ফেরার আগেই ধ্বংস হয়ে যায় বা 10 মান নির্গত হয়, আমরা এখনও ঠিক আছি!
যখন অনুরোধটি ফিরে আসে বা 10 তম মান অবশেষে নির্গত হয় তখন Observable
সম্পূর্ণ হয়ে যায় এবং সমস্ত সংস্থান পরিষ্কার হয়ে যায়।
উত্স 3
আমরা যদি তাকান এই উদাহরণে একই rangle থেকে গাইড আমরা দেখতে পারি যে Subscription
করতে route.params
একটি প্রয়োজন নেই unsubscribe()
কারণ আমরা জানি না যখন সেই params
পরিবর্তন (নতুন মান emitting) বন্ধ করে দেব।
অংশটি নেভিগেট করে ধ্বংস করা যেতে পারে যেখানে রুট প্যারামগুলি সম্ভবত এখনও পরিবর্তিত হবে (অ্যাপটি শেষ না হওয়া পর্যন্ত তারা প্রযুক্তিগতভাবে পরিবর্তিত হতে পারে) এবং সাবস্ক্রিপশনে বরাদ্দকৃত সংস্থানগুলি এখনও বরাদ্দ করা হবে কারণ একটি হয়নি completion
।
Subscription
যায়http-requests
না কারণ তারা কেবলonNext
একবার কল করে এবং তারপরে তারা কল করেonComplete
।Router
পরিবর্তে আহ্বানonNext
বারংবার এবং কল কখনো পারেonComplete
(নিশ্চিত না যে সম্পর্কে ...)। একইObservable
থেকেEvent
গুলি এস থেকে যায় । সুতরাং আমার ধারণা এটি হওয়া উচিতunsubscribed
।