2013-05-01 14 views
10

Jeśli zadzwonię connect z doStuff, pojawia się komunikat, że „gniazdo jest podłączony”, ale callback nie jest tzw. Czego tu mi brakuje?Obietnica zwrotna nie nazywa się Kątowymi JS

$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

Mam ten sam problem w reactjs przy użyciu socket.io @markrajcok – srinivas

Odpowiedz

25

W angularjs obiecują wyniki są propagowane asynchronicznie, w środku cyklu $ strawienia. Tak więc twoja funkcja zwrotna zarejestrowana w funkcji then() zostanie wywołana tylko po wprowadzeniu cyklu $ digest.

Tak więc, gdy twoje gniazdo się połączy, jesteśmy w cyklu trawienia. then() tworzy nową obietnicę, ale wyniki tej then() nie będą propagowane aż do następnego cyklu podsumowania, który nigdy nie nastąpi (ponieważ nie ma $timeout lub $http lub zdarzenia DOM, aby je wywołać). Jak tylko @Ajay właśnie wysłana, jeśli dodasz $ scope. $ Apply(), spowoduje to cykl trawienny, a zobaczysz wyniki.

+0

Dzięki, to działa teraz! – dndr

+1

Doskonałe wyjaśnienie, dzięki! –

8

należy używać $ zakres. $ Apply() należy znaleźć kod poniżej roboczą

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

Mam ten sam problem w reactjs – srinivas