2013-05-01 46 views
10

如果我把從doStuffconnect,我得到「套接字連接」,但callback不叫消息。我在這裏錯過了什麼?無極回調不叫角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

我在使用socket.io時出現了同樣的問題@ markrajcok – srinivas 2016-09-07 15:45:16

回答

25

在AngularJS保證結果異步傳播,一個$消化週期內。因此,只有在輸入$ digest循環時纔會調用您在()中註冊的回調函數。

所以,當你的套接字連接時,我們處於一個摘要循環中。 then()創建一個新的承諾,但then()的結果將不會傳播到下一個摘要週期,因爲沒有$timeout$http或DOM事件觸發一個。正如@Ajay剛剛發佈的那樣,如果添加$ scope。$ apply(),它將導致一個摘要循環,您將看到結果。

+0

謝謝,它現在可行! – dndr 2013-05-01 18:29:59

+1

優秀的解釋,謝謝! – 2014-11-08 19:08:40

8

您應該使用$範圍。$適用(),請找到下面的工作代碼

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 2016-09-07 15:44:29