2013-05-01 33 views
10

ben doStuff den connect dersek, ben "soket bağlandığında", ancak callback çağrılmaz bu mesajı olsun. Burada neyi özlüyorum?Promise geri arama

$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

cevap

25

bulabilirsiniz) (uygulamak sonuçları $ sindirmek döngüsü içinde uyumsuz yayılır söz veriyorum. Bu nedenle,() ile kaydedilen geriçağırım işleviniz sadece bir $ digest döngüsü girildiğinde çağrılır.

Soketiniz bağlandığında, sindirim döngüsündeyiz. then(), yeni bir söz yaratır, ancak bu then()'un sonuçları, hiçbir zaman gelmeyen bir sonraki özet döngüsüne ($timeout veya $http veya DOM olayını tetiklemek için DOM olayı) kadar yayılmaz. @Ajay'in yayınladığı gibi, $ kapsamı eklerseniz $ apply(), bir özet döngüsüne neden olur ve sonuçları görürsünüz.

+0

Teşekkürler, şimdi çalışıyor! – dndr

+1

Mükemmel bir açıklama, teşekkürler! –

8

Sen $ kapsamı kullanarak edilmelidir. $ Angularjs ise aşağıda çalışan kodu

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

kullanırken reaktivitede de aynı problem var Ben de aynı problemi reakt'larda kullanıyorum – srinivas