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で同じ問題が発生しました@markrajcok – srinivas

答えて

25

を見つけてください)(適用結果は$ダイジェストサイクル内で、非同期的に伝播されることを約束します。したがって、then()で登録されたコールバック関数は、$ダイジェストサイクルを入力するときにのみ呼び出されます。

ソケットが接続されると、ダイジェストサイクルに入ります。 then()は新しい約束を作成しますが、その結果は$timeout、または$http、または1つをトリガーする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