2013-05-01 19 views
10

अगर मैं doStuff से connect कहते हैं, मैं संदेश है कि "सॉकेट से जुड़ा हुआ है", लेकिन callback नहीं बुलाया जाता है मिलता है। मुझे यहां क्या समझ नहीं आ रहा है?वादा कॉलबैक कोणीय जे एस में नहीं बुलाया

$scope.connect = function() { 
    var defer = $q.defer(); 
    ws = new WebSocket("ws://server.com:port"); 
    ws.onopen = function(){ 
     console.log("Socket connected"); 
     defer.resolve("socket connected"); 
    }; 
    return defer.promise; 
} 

$scope.doStuff = function() { 
    $scope.connect().then(function(data) { 
     console.log("And we're off!", data); 
    }); 
} 
+0

socket.io @markrajcok – srinivas

उत्तर

25

AngularJS में मिल वादा परिणाम एसिंक्रोनस उगाया जाता है एक चक्र $ पचाने के अंदर। इसलिए, आपके कॉलबैक फ़ंक्शन को तब() के साथ पंजीकृत किया जाएगा केवल $ पाचन चक्र दर्ज करने पर ही बुलाया जाएगा।

तो, जब आपकी सॉकेट कनेक्ट होती है, तो हम एक पाचन चक्र में होते हैं। then() एक नया वादा बनाता है, लेकिन then() के परिणाम अगले पाचन चक्र तक प्रचारित नहीं होंगे, जो कभी नहीं आता है (क्योंकि $timeout, या $http, या एक ट्रिगर करने के लिए DOM ईवेंट नहीं है)। जैसा कि @Ajay ने अभी पोस्ट किया है, यदि आप $ स्कोप जोड़ते हैं। $ लागू करें(), यह एक पाचन चक्र का कारण बन जाएगा और आप परिणाम देखेंगे।

+0

धन्यवाद, यह अब काम करता है! – dndr

+1

उत्कृष्ट स्पष्टीकरण, धन्यवाद! –

8

आप $ गुंजाइश का उपयोग करना चाहिए। $ (लागू) कृपया नीचे काम कर कोड

function formctrl($scope,$q,$timeout) { 
      $scope.connect = function() { 
       var defer = $q.defer(); 
       var ws = new WebSocket("ws://echo.websocket.org"); 
       ws.onopen = function (evt) { 
        defer.resolve("socket connected"); 
        $scope.$apply(); 
       } 
       return defer.promise; 
      } 

      $scope.raise = function() { 
       $scope.connect().then(function (data) { 
        alert(data); 

       }); 
      } 


     } 
+0

का उपयोग करते समय मुझे प्रतिक्रियाओं में एक ही समस्या है I प्रतिक्रिया में – srinivas

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