2013-05-01 2 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를 사용할 때 reactjs에서 동일한 문제가 발생합니다. – srinivas

답변

25

을 찾아주세요) (적용 결과는 $ 소화주기 내에서 비동기 적으로 전달됩니다 약속드립니다. 따라서 then()에 등록 된 콜백 함수는 $ digest 사이클을 입력 할 때만 호출됩니다.

그래서 소켓이 연결되면 우리는 다이제스트주기에 있습니다. then()은 새로운 약속을 생성하지만 그 결과는 $timeout 또는 $http 또는 트리거하는 DOM 이벤트가 없기 때문에 다음 번 다이제스트주기까지 전파되지 않습니다. @Ajay가 방금 게시 한 것처럼 $ scope. $ apply()를 추가하면 요약주기가 발생하고 결과가 표시됩니다.

+0

고마워, 이제 작동합니다! – dndr

+1

훌륭한 설명, 감사합니다! –

8

당신은 $ 범위를 사용한다. $ AngularJS와에서 아래의 작업 코드

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

reactjs에서 동일한 문제가 발생했습니다. – srinivas