2014-09-12 5 views
5

मैं एक नोड सॉकेट.ओ सर्वर और एक कोणीय आधारित सॉकेट.ओ क्लाइंट (angular-socket.io का उपयोग करके) के साथ काम कर रहा हूं, और यह 1 विशिष्ट स्थिति को छोड़कर अच्छी तरह से काम करता है: मैं यह नहीं समझ सकता कि पूरी तरह से कैसे जब सॉकेट कनेक्ट करने में सक्षम नहीं था, तो जब मैं इसके साथ किया जाता है तो सॉकेट को नष्ट कर दें।AngularJS: socket.io सॉकेट को नष्ट कर देता है

वर्कफ़्लो यह है: किसी दिए गए पृष्ठ पर एक मोडल खोलने के लिए एक बटन होता है, मोडल के उद्घाटन सॉकेट फैक्ट्री को मोडल नियंत्रक में इंजेक्ट करता है और सॉकेट.ओ सर्वर पर कनेक्शन बनाया जाता है। जब यह सॉकेट कनेक्ट हो सकता है तो यह सब ठीक काम करता है। जब मोडल बंद हो जाता है, $ scope.destroy कहा जाता है और मोडल नियंत्रक में हैंडलर सॉकेट को साफ करने का प्रयास करता है।

यह मोडल बंद और कई बार फिर से खोल दिया जा सकता है, या केवल एक बार। सॉकेट को कई बार बनाने/नष्ट करने की मेरी प्रक्रिया मेरे मुद्दे का हिस्सा हो सकती है, यह सही प्रतिमान नहीं हो सकता है, लेकिन जब मोडल बंद हो जाता है तो इसके साथ बातचीत करने का कोई तरीका नहीं होगा और उस पृष्ठ के बाद सॉकेट निश्चित रूप से नहीं छोड़ा जाएगा अस्तित्व में रहने या जुड़े रहने की जरूरत नहीं है।

सॉकेट निर्माण:

angular.module('app.common.newSocketFactory', ['btford.socket-io']) 
.factory('newSocketFactory', ['socketFactory', function(socketFactory){ 

return function(){ 
    return socketFactory({ioSocket:io.connect('http://localhost:3000', {forceNew: true})}); 
}; 

}]); 

इंजेक्शन:

angular.module('...', [ 
    'app.common.newSocketFactory', 
    .... 
]) 
.controller('Controller', ['$scope', '$modalInstance', 'newSocketFactory', ... 
    function ($scope, $modalInstance, newSocketFactory, ...){ 
    ... 

    $scope.socket = newSocketFactory(); 

यहाँ है मेरी नष्ट हैंडलर:

$scope.$on('$destroy', function(){ 
    $scope.socket.emit('unlisten'); 
    $scope.socket.disconnect(); //have tried passing true too. 
}); 

यह सही ढंग से काम करता है जब सॉकेट कनेक्ट कर सकता था पहले मोडल था बंद, सर्वर में डिस्कनेक्ट की गई घटना का मानना ​​है कि क्लाइंट डिस्कनेक्ट हो गया है। इसके अतिरिक्त, मैं मोडल बंद कर सकता हूं और फिर सर्वर को बंद कर सकता हूं और फिर से कनेक्ट करने का कोई प्रयास नहीं होता है।

जब मोडल खोलते समय सर्वर बंद हो जाता है, तो ट्रांसपोर्टर्रॉर्स होते हैं और प्रयासों को फिर से कनेक्ट कर दिया जाता है। अगर मैं इस बिंदु पर मोडल बंद करता हूं, तो त्रुटियां जारी रहती हैं, और यदि मैं सर्वर को पुनरारंभ करता हूं तो पुनः प्रयास सफल होता है और क्लाइंट सर्वर से कनेक्ट होगा। इसका सबसे बुरा हिस्सा यह है कि मैं इस सॉकेट का उपयोग हार्डवेयर के एक टुकड़े पर परमाणु पहुंच को बनाए रखने के लिए करता हूं, जो पहली सॉकेट द्वारा बंद कर दिया जाता है। जब तक मैं सर्वर को पुनरारंभ नहीं करता, सॉकेट को कनेक्ट करने की अनुमति देता है, और फिर मोडल को बंद करता है (मेरे अलग-अलग दायरे और socket.disconnect() पर $ $ को नष्ट कर देता है, मुझे सॉकेट को नष्ट करने के लिए पूरे पृष्ठ को रीफ्रेश करना होगा।

यह संभावित रूप से एक कोणीय-socket.io प्रश्न या नियमित सॉकेट.ओ क्लाइंट प्रश्न है। मैंने कोणीय-socket.io में github से पूछा कि बिना किसी प्रतिक्रिया के कोणीय-socket.io क्लाइंट सॉकेट का उचित तरीके से निपटान कैसे किया जाए।

मेरा प्रश्न यह है: ए) अगर मैं सॉकेट.ओ के साथ एक बड़ा अशुद्ध-पुस नहीं बना रहा हूं, तो मैं इस क्लाइंट सॉकेट और बी का सुरक्षित रूप से निपटान कैसे कर सकता हूं) यदि मैं यह गलत कर रहा हूं, तो बेहतर तरीका क्या है एक वेबसाइकिल प्रबंधित करने के बारे में जाने के लिए जो पृष्ठ से पृष्ठ पर बने रहने के लिए नहीं माना जाता है।

नोट: कोणीय-socket.io सॉकेट कोणीय scopes से निपटने में मदद करने के लिए कुछ सामान के साथ मूल सॉकेट लपेटता है। डिस्कनेक्ट() को कॉल करते समय, परिणाम अंतर्निहित सॉकेट की तरह दिखता है। मैंने झूठी इत्यादि को रीकनेक्ट सेटिंग्स सेट करने का प्रयास किया है, लेकिन इसमें से कोई भी काम नहीं कर रहा है, और मुझे यह पसंद नहीं है कि स्कोप पूरी तरह नष्ट हो जाने के बावजूद सॉकेट अभी भी मौजूद है, भले ही मैं कनेक्ट करने की कोशिश करना बंद कर दूं।

धन्यवाद

उत्तर

1

मैं इसी तरह के मुद्दों के साथ निपटा जब मैं निष्कर्ष है कि SocketIO एक गन्दा राज्य प्रबंधन कम से कम कहना है था ... तो मैं अपने खुद के पुनर्संयोजन तर्क है, उदा बनाने की कोशिश करता हूँ डिस्कनेक्ट या त्रुटि पर पुन: कनेक्शन अक्षम करें, और अगर मैं इसे चाहता हूं तो केवल पुनः कनेक्ट करें।

मैं देशी सॉकेटियो का उपयोग राज्य हैंडलर जैसे (stuff) => $timeout(() => myHandler(stuff)) और इसके आसपास सिंगलटन कोणीय सेवा डालने पर भी विचार करता हूं। इस तरह आपका सिर बंद मोड, खोए गए स्कोप्स इत्यादि के बारे में परेशान नहीं होगा।

कृपया अपने परिणाम भेजें, मुझे तब से बहुत दिलचस्पी है जब आपने अनुभव किया है।

+1

अरे, उत्तर के लिए धन्यवाद। मैंने हाल ही में इस पर काम नहीं किया है और जल्द ही इसे फिर से काम करने का मौका नहीं मिलेगा (सुविधाओं को कुछ समय के लिए प्रोड में रखा गया है और स्थिर लगता है)। अंतिम परिणाम जिसने हमारे लिए ठीक काम किया है, कॉन्फ़िगरेशन सेट करने के लिए कॉन्फ़िगरेशन (io.connect को भेजा गया) था। नया = सत्य। वहां से, मैं var ioSocket = io.connect (URL + ':' + पोर्ट, विकल्प) के साथ मैन्युअल रूप से सॉकेट बना देता हूं; var सॉकेट = सॉकेट फैक्टरी ({ioSocket: ioSocket}); वहां से, डिस्कनेक्ट करने का प्रयास करते समय मैं पहले सभी श्रोताओं को सॉकेट पर हटा देता हूं और फिर socket.disconnect() को कॉल करता हूं। यह अब तक हमारे लिए काम किया है। –

+0

धन्यवाद, हम मजबूर पुन: कनेक्ट का उपयोग करते हैं और मैन्युअल रूप से डिस्कनेक्ट() भी कहते हैं। मुझे आशा है कि सॉकेटियो लोग विश्वसनीय राज्य मशीन या कुछ ... –

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