2016-11-29 26 views
8

में http देखे जाने योग्य से सदस्यता छोड़ें http सदस्यता से Angular2 सेवा के भीतर सदस्यता समाप्त करने का सबसे अच्छा अभ्यास क्या है?कोणीय 2: सेवा

वर्तमान में मैं यह करता हूं लेकिन मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका होगा या नहीं।

import { Injectable } from "@angular/core"; 
import { Http } from "@angular/http"; 

import { Subject } from "rxjs/Subject"; 
import { ISubscription } from "rxjs/Subscription"; 

@Injectable() 
export class SearchService { 
    private _searchSource = new Subject<any>(); 

    public search$ = this._searchSource.asObservable(); 

    constructor(private _http: Http) {} 

    public search(value: string) { 
     let sub: ISubscription = this._http.get("/api/search?value=" + value) 
      .map(response => <any>response.json()) 
      .do(data => this._searchSource.next(data)) 
      .finally(() => sub.unsubscribe()).subscribe(); 
    } 

} 
+3

अवलोकन योग्य पूर्ण होने पर सदस्यता समाप्त करने के लिए अनावश्यक और व्यर्थ लगता है। –

+1

@ günter-zöchbauer वैसे यह मेरा सवाल नहीं था अगर यह समझ में आता है कि मेरा सवाल था: क्या सबसे अच्छा अभ्यास है। इसलिए? –

+0

मुझे नहीं लगता कि उन चीजों के लिए सर्वोत्तम प्रथाएं हैं जो समझ में नहीं आती हैं: डी शायद बस - ऐसा मत करो। –

उत्तर

19

कोणीय में एक सेवा एक सिंगलटन है। इसका मतलब है कि सेवा आपके आवेदन के पूरे जीवनकाल के लिए मौजूद होगी।

कारण आपको एक अवलोकन योग्य से सदस्यता समाप्त करने की आवश्यकता है, स्मृति रिसाव से बचने के लिए है। आपको स्मृति लीक कब मिलती है? अगर कुछ कचरा इकट्ठा किया गया है, जबकि यह अभी भी एक देखने योग्य, घटना श्रोता, सॉकेट, की सदस्यता लेता है ...

चूंकि एक कोणीय सेवा कभी नष्ट नहीं होती है, जब तक कि आपका पूरा आवेदन नष्ट नहीं हो जाता है, वहां से सदस्यता समाप्त करने का कोई वास्तविक कारण नहीं है यह। अवलोकन योग्य या तो पूर्ण या त्रुटि होगी या जब तक आपका आवेदन करता है तब तक जारी रहेगा।

निष्कर्ष: सेवा में सदस्यता छोड़ना एक प्रकार का व्यर्थ है, क्योंकि स्मृति रिसाव की कोई संभावना नहीं है।

+0

उत्तर @ kwintenp के लिए धन्यवाद। लेकिन जैसा कि आप ऊपर देखते हैं, खोज विधि की प्रत्येक कॉल एक नया अवलोकन कर देगा जो मुझे डेटा प्राप्त करने के लिए सदस्यता लेनी होगी। क्या मुझे स्मृति रिसाव से बचने के लिए सदस्यता की सदस्यता समाप्त नहीं करनी पड़ी? –

+1

यह ठीक है। लौटाई गई प्रत्येक सदस्यता स्वयं को साफ कर देगी। HTTP सेवा स्वयं के बाद साफ हो जाती है। जब एक्सएचआर परिणाम प्राप्त होता है, तो सब्सक्रिप्शन की पूरी विधि को बुलाया जाता है और इसलिए स्वयं सदस्यता रद्द कर दिया जाता है। हालांकि, http सेवा के लौटे पर्यवेक्षण पर सदस्यता रद्द करने की विधि को कॉल करने का मामला हो सकता है। अगर हम कभी भी हमारे HTTP अनुरोध पर रद्द करना चाहते हैं तो हम सदस्यता छोड़ देंगे। यह साफ करने के लिए कवर के तहत निरस्त कॉल करता है। – Thibs

+5

"सेवा आपके आवेदन के पूरे जीवनकाल के लिए मौजूद होगी" सत्य नहीं है। मैं सिर्फ एक घटक के जीवनकाल के लिए एक सेवा प्रदान कर सकता हूं, ताकि जब घटक नष्ट हो जाए तो यह नष्ट हो जाता है ... –

संबंधित मुद्दे