2013-05-01 19 views
10

Wenn ich connect von doStuff nennen, erhalte ich die Meldung, dass „die Steckdose angeschlossen ist“, aber die callback wird nicht aufgerufen. Was fehlt mir hier?Versprechen Rückruf nicht in Angular JS genannt

$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

Ich habe das gleiche Problem in reactjs bei der Verwendung von socket.io @markrajcok – srinivas

Antwort

25

In AngularJS die unter Arbeitscode bitte Ergebnisse versprechen asynchron propagiert werden, innerhalb eines Zyklus verdauen $. Daher wird Ihre Callback-Funktion, die mit then() registriert wurde, nur bei Eingabe eines $ Digest-Zyklus aufgerufen.

Also, wenn Ihr Socket verbindet, sind wir in einem Digest-Zyklus. then() erstellt ein neues Versprechen, aber die Ergebnisse dieser then() werden nicht bis zum nächsten Digest-Zyklus weitergegeben, der nie kommt (weil es keine $timeout, oder $http, oder DOM-Ereignis gibt, um eine zu lösen). Wie @Ajay gerade geschrieben hat, wenn Sie $ scope. $ Apply() hinzufügen, wird es einen Digest-Zyklus verursachen und Sie werden die Ergebnisse sehen.

+0

Danke, es funktioniert jetzt! – dndr

+1

Hervorragende Erklärung, danke! –

8

sollten Sie $ scope werden. $ Gelten()

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

Ich habe das gleiche Problem in reactjs – srinivas

Verwandte Themen