এইচটিটিপি পদ্ধতি দ্বারা নির্মিত পর্যবেক্ষণগুলি থেকে কি সাবস্ক্রাইব করা দরকার?


211

মেমরি ফাঁস রোধ করতে আপনার কি কৌনিক 2 টি এইচটি কল থেকে সদস্যতা বাতিল করতে হবে?

 fetchFilm(index) {
        var sub = this._http.get(`http://example.com`)
            .map(result => result.json())
            .map(json => {
                dispatch(this.receiveFilm(json));
            })
            .subscribe(e=>sub.unsubscribe());
            ...


উত্তর:


253

সুতরাং উত্তর না, আপনি না। Ng2এটি নিজেই পরিষ্কার করা হবে।

অ্যাঙ্গুলারের এইচটিপি এক্সএইচআর ব্যাকএন্ড উত্স থেকে এইচটিটিপি পরিষেবা উত্স:

এখানে চিত্র বর্ণনা লিখুন

complete()ফলাফল পাওয়ার পরে এটি কীভাবে চালায় তা লক্ষ্য করুন । এর অর্থ এটি সম্পূর্ণরূপে সাবস্ক্রাইব করে। সুতরাং আপনার নিজের এটি করার দরকার নেই।

যাচাই করার জন্য এখানে একটি পরীক্ষা দেওয়া হয়েছে:

  fetchFilms() {
    return (dispatch) => {
        dispatch(this.requestFilms());

        let observer = this._http.get(`${BASE_URL}`)
            .map(result => result.json())
            .map(json => {
                dispatch(this.receiveFilms(json.results));
                dispatch(this.receiveNumberOfFilms(json.count));
                console.log("2 isUnsubscribed",observer.isUnsubscribed);
                window.setTimeout(() => {
                  console.log("3 isUnsubscribed",observer.isUnsubscribed);
                },10);
            })
            .subscribe();
        console.log("1 isUnsubscribed",observer.isUnsubscribed);
    };
}

যেমনটি প্রত্যাশা করা হয়েছিল, আপনি দেখতে পাচ্ছেন যে ফলাফলটি পাওয়ার পরে এবং পর্যবেক্ষণযোগ্য অপারেটরদের সাথে সমাপ্ত হওয়ার পরে এটি সর্বদা স্বয়ংক্রিয়ভাবে সাবস্ক্রাইব হয়। এটি একটি টাইমআউট (# 3) এ ঘটে তাই আমরা সমস্ত কাজ সম্পন্ন হয়ে গেলে এবং পর্যবেক্ষণের স্থিতি পরীক্ষা করতে পারি।

এবং ফলাফল

এখানে চিত্র বর্ণনা লিখুন

সুতরাং, কোনও ফাঁস Ng2স্বয়ংক্রিয় সদস্যতা হিসাবে উপস্থিত হবে না !

উল্লেখ করার জন্য দুর্দান্ত: এটি Observableযেমন হিসাবে শ্রেণীবদ্ধ করা হয় finite, তার বিপরীতে infinite Observableযেমন একটি অসীম তথ্য প্রবাহিত হয় clickউদাহরণস্বরূপ ডোম শ্রোতার মতো নির্গত হতে পারে ।

এই বিষয়ে সাহায্যের জন্য ধন্যবাদ, রবিবয়।


17
যে ক্ষেত্রে ব্যবহারকারীরা প্রতিক্রিয়া আসার আগে পৃষ্ঠাটি ছেড়ে দেয়, বা ব্যবহারকারী দর্শন ছাড়ার আগে যদি প্রতিক্রিয়া কখনও না আসে সে ক্ষেত্রে কী ঘটে? এটি কি ফুটো হওয়ার কারণ নয়?
থিবস

1
আমি উপরেরটিও জানতে চাই।
1984

4
@ 1984 উত্তরটি সর্বদা বাতিল করুন CR এই মন্তব্যে উত্থাপিত ঠিক কারণটির জন্য এই উত্তরটি সম্পূর্ণ ভুল। দূরে নেভিগেট করা ব্যবহারকারী হ'ল একটি মেমরি লিঙ্ক। এছাড়াও, যদি সদস্যতাটির কোডটি ব্যবহারকারী নেভিগেট করার পরে চালিত হয় তবে এটির ত্রুটি হতে পারে / অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া হতে পারে। আমি সমস্ত পর্যবেক্ষণে টেকহাইল (() => this.componalActive) ব্যবহার করার ঝোঁক রাখি এবং একটি উপাদানটিতে সমস্ত পর্যবেক্ষণযোগ্যগুলি পরিষ্কার করার জন্য এই ডটকম্পোনালটিসিটি = এনজিওএনডাস্ট্রয়েতে মিথ্যা সেট করেছি।
লেনি

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

1
@ ইউসেফটাগলাবি , এফওয়াইআই, অফিশিয়াল কৌণিক ডকুমেন্টেশন ( কৌণিক.ইও / গুইড / এইচটিপি ) উল্লেখ করেছে যে: "অ্যাসিঙ্কপাইপ স্বয়ংক্রিয়ভাবে আপনার জন্য সাবস্ক্রাইব (এবং সাবস্ক্রাইব) করেছে।" সুতরাং, এটি সত্যই সরকারীভাবে নথিভুক্ত।
হুডগি

96

লোকেরা কী নিয়ে কথা বলছেন !!!

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

1) সম্পদ পরিষ্কার করুন। অন্যরা যেমন বলেছেন যে এটি এইচটিটিপি পর্যবেক্ষণযোগ্যদের জন্য একটি নগণ্য সমস্যা। এটি কেবল নিজেকে পরিষ্কার করবে।

2) subscribeহ্যান্ডলারটি চালানো থেকে আটকাবেন।

(এইচটিটিপি-র ক্ষেত্রে এটি প্রকৃতপক্ষে ব্রাউজারেও অনুরোধটি বাতিল করে দেবে - সুতরাং এটি প্রতিক্রিয়া পড়তে সময় নষ্ট করবে না But তবে এটি আসলে নীচের আমার মূল বিষয়টির বাইরে))

2 নম্বর প্রাসঙ্গিকতা আপনার সাবস্ক্রাইব হ্যান্ডলার যা করে তার উপর নির্ভর করে:

যদি আপনার subscribe()হ্যান্ডলার ফাংশনটিতে এমন কোনও ধরণের পার্শ্ব প্রতিক্রিয়া থাকে যা অনাকাঙ্ক্ষিত হয় যদি তা যাকেই বন্ধ বা নিষ্পত্তি হয় কল করে তবে তা কার্যকর হওয়া থেকে রোধ করতে আপনাকে অবশ্যই সাবস্ক্রাইব করতে হবে (বা শর্তযুক্ত যুক্তি যুক্ত করুন)।

কয়েকটি বিষয় বিবেচনা করুন:

1) একটি লগইন ফর্ম। আপনি ব্যবহারকারীর নাম এবং পাসওয়ার্ড লিখুন এবং 'লগইন' ক্লিক করুন। যদি সার্ভারটি ধীর হয় এবং আপনি ডায়ালগটি বন্ধ করতে এস্কেপ চাপার সিদ্ধান্ত নেন? আপনি সম্ভবত ধরে নেবেন যে আপনি লগ ইন করেননি, তবে আপনি যদি পালানোর সময় HTTP অনুরোধটি ফিরে আসে তবে আপনি সেখানে যা কিছু যুক্তি রেখেছেন তার পরেও আপনি কার্যকর করতে পারবেন। এটি কোনও অ্যাকাউন্ট পৃষ্ঠাতে পুনর্নির্দেশের ফলে, একটি অযাচিত লগইন কুকি বা টোকেন ভেরিয়েবল সেট হওয়ার ফলাফল হতে পারে। এটি সম্ভবত আপনার ব্যবহারকারী প্রত্যাশা করেনি।

2) একটি 'প্রেরণ ইমেল' ফর্ম।

যদি subscribe'সেন্ডইমেল' এর হ্যান্ডলারটি 'আপনার ইমেলটি প্রেরণ করা হয়' অ্যানিমেশনটি ট্রিগার করার মতো কিছু করে, আপনাকে অন্য কোনও পৃষ্ঠায় স্থানান্তর করে বা নিষ্পত্তি হয়েছে এমন কোনও কিছু অ্যাক্সেস করার চেষ্টা করে তবে আপনি ব্যতিক্রম বা অযাচিত আচরণ পেতে পারেন।

এছাড়াও unsubscribe()'বাতিল' মানে ধরে না নেওয়ার বিষয়ে সতর্ক থাকুন । এইচটিটিপি বার্তাটি একবারে ফ্লাইটে unsubscribe()পৌঁছে গেলে এটি ইতিমধ্যে আপনার সার্ভারে পৌঁছে গেলে HTTP অনুরোধটি বাতিল করবে না will এটি কেবল আপনার কাছে ফিরে আসা প্রতিক্রিয়া বাতিল করবে। এবং ইমেল সম্ভবত পাঠানো হবে।

আপনি যদি কোনও ইউআই উপাদানগুলির মধ্যে সরাসরি ইমেল প্রেরণের জন্য সাবস্ক্রিপশন তৈরি করেন তবে আপনি সম্ভবত নিষ্পত্তি করার জন্য সাবস্ক্রাইব করতে চাইবেন, তবে ইমেলটি যদি কোনও নন-ইউআই সেন্ট্রালাইজড সার্ভিস দ্বারা প্রেরণ করা হয় তবে আপনার সম্ভবত প্রয়োজনের দরকার পড়বে না।

3) একটি কৌণিক উপাদান যা ধ্বংস / বন্ধ হয়। এখনও অবধি চলমান যে কোনও HTTP পর্যবেক্ষণগুলি সাবস্ক্রাইব না করা অবধি তাদের যুক্তি পূর্ণ এবং পরিচালনা করবে onDestroy()। ফলাফলগুলি তুচ্ছ বা না তা নির্ভর করে আপনি সাবস্ক্রাইব হ্যান্ডেলারটিতে যা করেন তার উপর নির্ভর করবে। আপনি যদি এমন কিছু আপডেট করার চেষ্টা করেন যা অস্তিত্বহীন তখন আপনি একটি ত্রুটি পেতে পারেন।

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

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

টিপ: Subscriptionএতে একটি closedবুলিয়ান সম্পত্তি রয়েছে যা উন্নত ক্ষেত্রে কার্যকর হতে পারে। এটি সম্পূর্ণ হওয়ার পরে এইচটিটিপি-র জন্য এটি সেট করা হবে। কৌণিক এটি কিছু পরিস্থিতিতে একটি সেট করতে সহায়ক হতে পারে _isDestroyedসম্পত্তিতে ngDestroyযা আপনার দ্বারা চেক করা যায় subscribeহ্যান্ডলার।

টিপ 2: একাধিক সাবস্ক্রিপশন পরিচালনা করে আপনি যদি এটির জন্য একটি অ্যাড-হক new Subscription()অবজেক্ট এবং add(...)অন্য কোনও সাবস্ক্রিপশন তৈরি করতে পারেন - সুতরাং আপনি যখন প্রধানটি থেকে সাবস্ক্রাইব করেন তখন এটি সমস্ত সংযুক্ত সাবস্ক্রিপশনও বাতিল করে দেবে।


2
আরও মনে রাখবেন যে যদি আপনার এমন কোনও পরিষেবা থাকে যা কাঁচা HTTP কাটিয়ে উঠতে সক্ষম হয় এবং সাবস্ক্রাইব করার আগে আপনি এটি পাইপ করেন তবে আপনাকে কেবল চূড়ান্ত পর্যবেক্ষণযোগ্য থেকে সাবস্ক্রাইব করতে হবে, অন্তর্নিহিত HTTP পর্যবেক্ষণযোগ্য নয়। আসলে আপনার সরাসরি HTTP- তে সাবস্ক্রিপশনও থাকবে না যাতে আপনি পারবেন না।
সাইমন_উইভার

যদিও সদস্যতা ছাড়াই ব্রাউজারের অনুরোধ বাতিল করে, সার্ভারটি এখনও অনুরোধটিতে কাজ করে। অপারেশনটি বাতিল করতে সার্ভারকে অন্তরঙ্গ করার কোনও উপায় আছে কি? আমি তাড়াতাড়ি HTTP অনুরোধগুলি প্রেরণ করছি, যার মধ্যে বেশিরভাগ সদস্যতা বাতিল করে বাতিল করা হয়েছে। তবে, সার্ভার এখনও ক্লায়েন্ট কর্তৃক বাতিল হওয়া অনুরোধগুলিতে কাজ করে যা বৈধ অনুরোধটির অপেক্ষা করতে বাধ্য করে।
বালা

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

Ip টিপ 2 - এটি একটি প্রো-টিপ, anyone যে কেউ কেবল একটি ফাংশন কল করে একাধিক সাবস্ক্রিপশন থেকে সদস্যতা নিতে চান তার জন্য। .Add () পদ্ধতিটি ব্যবহার করে এবং এনজিস্টেরয়ে .unsubscribe () এর চেয়ে যোগ করুন।
অভয় ত্রিপাঠি

23

কলিং unsubscribeপদ্ধতি যেহেতু এই পদ্ধতি কল একটি ইন-উন্নতি HTTP অনুরোধ বাতিল করতে বরং হয় abortলোড এবং ত্রুটি ইভেন্টের অন্তর্নিহিত XHR বস্তু এবং অপসারণ শ্রোতাদের ওপর এক:

// From the XHRConnection class
return () => {
  _xhr.removeEventListener('load', onLoad);
  _xhr.removeEventListener('error', onError);
  _xhr.abort();
};

এটি বলেছে, unsubscribeশ্রোতাদের সরিয়ে দেয় ... সুতরাং এটি একটি ভাল ধারণা হতে পারে তবে আমি মনে করি না যে এটি একটি একক অনুরোধের জন্য প্রয়োজনীয় ;-)

আশা করি এটি আপনাকে সহায়তা করবে, থিয়েরি


: | এটি অযৌক্তিক: | আমি থামার উপায় খুঁজছিলাম ... তবে আমি অবাক হয়ে গিয়েছিলাম, এবং যদি এটি কিছুটা দৃশ্যে আমার কোডিং হয়: আমি এটি এরকম করতাম: y = x.subscribe((x)=>data = x); তারপরে একজন ব্যবহারকারী ইনপুটগুলিতে পরিবর্তন আনবে এবং x.subscribe((x)=>cachlist[n] = x); y.unsubscribe()আরে আপনি আমাদের সার্ভার সংস্থান ব্যবহার করেছেন, আমি জিতেছি আপনাকে ফেলে দেবে না ..... এবং অন্যান্য y.stop()
দৃশ্যে

16

আপনি যদি সমস্ত নেটওয়ার্কের গতিতে একটি নির্বিচার আচরণ চান তবে আনসাবস্ক্রাইব করা আবশ্যক

কল্পনা করুন যে উপাদানটি একটি ট্যাবে রেন্ডার হয়েছে - আপনি একটি 'GET' অনুরোধটি প্রেরণ করতে একটি বোতাম টিপুন। প্রতিক্রিয়া ফিরে আসতে 200 এমএস লাগবে। সুতরাং, আপনি যে কোনও মুহুর্তে ট্যাবটি বন্ধ করতে নিরাপদ তা জেনেও, মেশিনটি আপনার চেয়ে দ্রুততর হবে এবং এইচটিপি প্রতিক্রিয়াটি প্রক্রিয়াজাত হয়ে ট্যাবটি বন্ধ হওয়ার আগে এবং উপাদান A বিনষ্ট হওয়ার আগে সম্পূর্ণ হয়ে যায়।

খুব ধীর নেটওয়ার্কে কেমন? আপনি একটি বোতাম টিপুন, 'জিইটি' অনুরোধটি তার প্রতিক্রিয়া পেতে 10 সেকেন্ড সময় নেয়, তবে ট্যাবটি বন্ধ করার সিদ্ধান্ত নেওয়ার ক্ষেত্রে 5 সেকেন্ড অপেক্ষা করে। এটি পরবর্তীতে আবর্জনা-সংগ্রহের উপাদান A কে ধ্বংস করবে। একটি মিনিট অপেক্ষা করুন! , আমরা সাবস্ক্রাইব করি নি - এখন 5 সেকেন্ড পরে, একটি প্রতিক্রিয়া ফিরে আসবে এবং ধ্বংস উপাদানটির যুক্তি কার্যকর করা হবে। সেই কার্যকর করা এখন বিবেচনা করা হয় out-of-contextএবং এর ফলে খুব কম পারফরম্যান্স সহ অনেক কিছুই পাওয়া যায়।

সুতরাং, সবচেয়ে ভাল অনুশীলন হ'ল takeUntil()উপাদানটি ধ্বংস হয়ে যাওয়ার পরে HTTP কলগুলি থেকে ব্যবহার এবং সদস্যতা বাতিল করা।

import { Component, OnInit, OnDestroy } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

interface User {
  id: string;
  name: string;
  age: number;
}

@Component({
  selector: 'app-foobar',
  templateUrl: './foobar.component.html',
  styleUrls: ['./foobar.component.scss'],
})
export class FoobarComponent implements OnInit, OnDestroy {
  private user: User = null;
  private destroy$ = new Subject();

  constructor(private http: HttpClient) {}

  ngOnInit() {
    this.http
      .get<User>('api/user/id')
      .pipe(takeUntil(this.destroy$))
      .subscribe(user => {
        this.user = user;
      });
  }

  ngOnDestroy(): void {
    this.destroy$.next();  // trigger the unsubscribe
    this.destroy$.complete(); // finalize & clean up the subject stream
  }
}

BehaviorSubject()পরিবর্তে ব্যবহার করা এবং কেবল কল করা কি ঠিক complete()আছে ngOnDestroy()?
দক্ষম

আপনার এখনও সাবস্ক্রাইব করা দরকার ... কেন BehaviourSubjectআলাদা হবে?
বেন টালিডিয়োরোস

তারা সীমাবদ্ধ পর্যবেক্ষণযোগ্য হ'ল এইচটিপিপি্লিয়েন্ট পর্যবেক্ষণযোগ্যদের কাছ থেকে সাবস্ক্রাইব করার দরকার নেই, অর্থাত তারা কোনও মান নির্গমন করার পরে সম্পন্ন করে।
ইয়থার্থ ভার্শনে

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

12

এছাড়াও নতুন এইচটিটিপিপ্লায়েন্ট মডিউল সহ, একই আচরণ থেকে যায় প্যাকেজ / সাধারণ / HTTP / src / jsonp.ts


উপরের কোডটি ইউনিট পরীক্ষার থেকে মনে হচ্ছে, এটি বোঝায় যে এইচটিপিপ্লিনেন্টের সাহায্যে আপনাকে নিজের ( github.com/angular/angular/blob/… )। কমপ্লিট () কল করতে হবে
ক্লিভারপ্যাট্রিক

হ্যাঁ, আপনি ঠিক বলেছেন তবে আপনি যদি পরিদর্শন করেন ( github.com/angular/angular/blob/… ) আপনি তা দেখতে পাবেন। মূল প্রশ্নটি সম্পর্কে, স্পষ্টভাবে সাবস্ক্রাইব করা প্রয়োজন হলে? বেশিরভাগ ক্ষেত্রেই না, যেহেতু নিজেই কৌণিক দ্বারা পরিচালিত হবে। একটি দীর্ঘ ক্ষেত্রে প্রতিক্রিয়া হতে পারে এমন একটি ক্ষেত্রে হতে পারে এবং আপনি অন্য পথে চলে গিয়েছেন বা কোনও উপাদান নষ্ট করেছেন, সেক্ষেত্রে আপনি কোনও ব্যতিক্রম উত্থাপন করে এমন কিছু অ্যাক্সেস করার চেষ্টা করার সম্ভাবনা রয়েছে যার অস্তিত্ব নেই।
রিকার্ডো মার্টেনেজ

8

স্বয়ংক্রিয়ভাবে সম্পূর্ণ হওয়া পর্যবেক্ষণযোগ্যদের থেকে আপনার সদস্যতা বাতিল করা উচিত নয় (যেমন এইচটিটিপি, কল)) তবে অসীম পর্যবেক্ষণযোগ্যদের মতো সাবস্ক্রাইব করা প্রয়োজন Observable.timer()


6

কিছুক্ষণ পরীক্ষার পরে, ডকুমেন্টেশন পড়ার এবং এইচটিপিপি্লায়েন্টের উত্সকোড।

HttpClient: https://github.com/angular/angular/blob/master/packages/common/http/src/client.ts

HttpXhrBackend : https://github.com/angular/angular/blob/master/packages/common/http/src/xhr.ts

HttpClientModule: https://indepth.dev/exploring-the-httpclientmodule-in-angular/

কৌণিক ইউনিভার্সিটি: https://blog.angular-university.io/angular-http/

এই বিশেষ ধরণের পর্যবেক্ষকগুলি একক-মান স্রোত: HTTP অনুরোধটি সফল হলে এই পর্যবেক্ষণগুলি কেবল একটি মান নির্গত করে এবং তারপরে সম্পূর্ণ হবে

এবং "আমি কি প্রয়োজন" এর পুরো ইস্যুটির উত্তর বাতিল করতে চাই?

এটা নির্ভর করে. এইচটিটিপি কল মেমরিলিক্স কোনও সমস্যা নয়। সমস্যাগুলি হ'ল আপনার কলব্যাক ফাংশনে যুক্তি।

উদাহরণস্বরূপ: রাউটিং বা লগইন।

যদি আপনার কলটি লগইন কল হয় তবে আপনাকে "আনসাবস্ক্রাইব" করতে হবে না তবে ব্যবহারকারীকে পৃষ্ঠাটি ছেড়ে গেছে কিনা তা আপনাকে নিশ্চিত করতে হবে, ব্যবহারকারীর অনুপস্থিতিতে আপনি প্রতিক্রিয়াটি সঠিকভাবে পরিচালনা করছেন।


this.authorisationService
      .authorize(data.username, data.password)
      .subscribe((res: HttpResponse<object>) => {
          this.handleLoginResponse(res);
        },
        (error: HttpErrorResponse) => {
          this.messageService.error('Authentication failed');
        },
        () => {
          this.messageService.info('Login has completed');
        })

বিরক্তিকর থেকে বিপজ্জনক

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

উপাদানটি সক্রিয় নাও হতে পারে তবে সাবস্ক্রিপশন। কোনও প্রতিক্রিয়ার ক্ষেত্রে, ব্যবহারকারী হঠাৎ পুনরায় সাজানো হবে (আপনার হ্যান্ডেল রিসপনস () প্রয়োগের উপর নির্ভর করে)।

এটা ভাল না

এছাড়াও আপনি কল্পনা করুন যে ব্যবহারকারী পিসি ছাড়েন, বিশ্বাস করে তিনি এখনও লগইন করেননি। তবে আপনি ব্যবহারকারীকে লজিক করেছেন, এখন আপনার কাছে একটি সুরক্ষা সমস্যা রয়েছে।

সদস্যতা ছাড়াই আপনি কী করতে পারেন?

আপনাকে দেখার বর্তমান অবস্থার উপর নির্ভরশীল কল করুন:

  public isActive = false;
  public ngOnInit(): void {
    this.isActive = true;
  }

  public ngOnDestroy(): void {
    this.isActive = false;
  }

.pipe(takeWhile(value => this.isActive))প্রতিক্রিয়াটি কেবলমাত্র दृক্ষ সক্রিয় থাকা অবস্থায় পরিচালিত হবে তা নিশ্চিত করার জন্য ব্যবহারকারী ।


this.authorisationService
      .authorize(data.username, data.password).pipe(takeWhile(value => this.isActive))
      .subscribe((res: HttpResponse<object>) => {
          this.handleLoginResponse(res);
        },
        (error: HttpErrorResponse) => {
          this.messageService.error('Authentication failed');
        },
        () => {
          this.messageService.info('Login has completed');
        })

তবে আপনি কীভাবে নিশ্চিত হতে পারেন যে সাবস্ক্রিপশনটি স্মৃতিশক্তি সৃষ্টি করছে না?

"টিয়ারডাউনলজিক" প্রয়োগ করা থাকলে আপনি লগ করতে পারেন।

সাবস্ক্রিপশনের টিয়ারডাউন লজিক যখন সাবস্ক্রিপশনটি খালি বা সাবস্ক্রাইব করা থাকে তখন কল করা হবে।


this.authorisationService
      .authorize(data.username, data.password).pipe(takeWhile(value => this.isActive))
      .subscribe((res: HttpResponse<object>) => {
          this.handleLoginResponse(res);
        },
        (error: HttpErrorResponse) => {
          this.messageService.error('Authentication failed');
        },
        () => {
          this.messageService.info('Login has completed');
    }).add(() => {
        // this is the teardown function
        // will be called in the end
      this.messageService.info('Teardown');
    });

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

কেন সবসময় সাবস্ক্রাইব করবেন না?

আপনি কোনও পুট বা পোস্টের অনুরোধ করেছেন তা কল্পনা করুন। সার্ভারটি যেভাবেই বার্তাটি গ্রহণ করে, কেবল প্রতিক্রিয়াটি কিছুটা সময় নেয়। সাবস্ক্রাইব করা, পোস্টটি পূর্বাবস্থায় ফেরাবে না বা রাখবে না। তবে আপনি যখন সদস্যতা ত্যাগ করেন, আপনার কাছে প্রতিক্রিয়াটি পরিচালনা করার বা ব্যবহারকারীকে অবহিত করার সুযোগ থাকবে না, উদাহরণস্বরূপ ডায়ালগ বা টোস্ট / বার্তা ইত্যাদির মাধ্যমে inform

যে কারণে ব্যবহারকারী বিশ্বাস করতে পারে, পুট / পোস্ট অনুরোধটি করা হয়নি।

সুতরাং এটি নির্ভর করে। এটি আপনার ডিজাইনের সিদ্ধান্ত, এই জাতীয় সমস্যাগুলি কীভাবে মোকাবেলা করা যায়।


4

আপনার অবশ্যই এই নিবন্ধটি পড়া উচিত । এটি আপনাকে দেখায় যে কেন আপনাকে সর্বদা এইচটিপি থেকে সাবস্ক্রাইব করা উচিত ।

যদি অনুরোধটি তৈরি করার পরে কিন্তু ব্যাক-এন্ড থেকে উত্তর পাওয়ার আগে আপনি উপাদানটিকে অপ্রয়োজনীয় মনে করেন এবং এটি ধ্বংস করেন, আপনার সাবস্ক্রিপশনটি উপাদানটির রেফারেন্স বজায় রাখবে যাতে মেমরি ফাঁস হওয়ার সুযোগ তৈরি করে।

হালনাগাদ

উপরোক্ত নিশ্চয়তাটি সত্য বলে মনে হচ্ছে, তবে যাইহোক, উত্তর ফিরে এলে যাইহোক http সাবস্ক্রিপশনটি নষ্ট হয়ে যায়


1
হ্যাঁ এবং আপনি আসলে আপনার ব্রাউজারের নেটওয়ার্ক ট্যাবে একটি লাল 'বাতিল' দেখতে পাবেন যাতে আপনি নিশ্চিত হয়ে উঠতে পারেন যে এটি কাজ করে।
সাইমন_উইভার

-2

আরএক্সজেএস পর্যবেক্ষণযোগ্য মূলত সম্পর্কিত এবং সে অনুসারে কাজ করুন আপনি এটি সাবস্ক্রাইব করেছেন। আমরা যখন পর্যবেক্ষণযোগ্য এবং চলাচল তৈরি করি তখন এটি সম্পূর্ণ করি, পর্যবেক্ষণযোগ্য স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় এবং সাবস্ক্রাইব হয়ে যায়।

তারা পর্যবেক্ষকদের একই ফ্যাশনে কাজ করে তবে বেশ আলাদা ক্রমে। উপাদানগুলি ধ্বংস হয়ে যাওয়ার সময় তাদের সদস্যতা বাতিল করার জন্য আরও ভাল অনুশীলন W আমরা পরবর্তীকালে উদাহরণস্বরূপ এটি করতে পারি । এই। $ manageSubscription.unsubscibe ()

যদি আমরা নীচের মতো উল্লিখিত সিনট্যাক্সের মতো পর্যবেক্ষণযোগ্য তৈরি করে থাকি

** নতুন পর্যবেক্ষণযোগ্য ((পর্যবেক্ষক) => {** // ফেরত করুন এটি ঠান্ডা অবস্থায় পর্যবেক্ষণযোগ্য করে তোলে ** निरीक्षक ডট কম) (** *) **

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