10

connectから呼び出すと、 「ソケットが接続されましdoStuffた」というメッセージが表示されますが、は呼び出されません。ここで何が欠けていますか?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);
    });
}
4

2 に答える 2

25

AngularJS では、promise の結果は $digest サイクル内で非同期に伝播されます。そのため、then() で登録されたコールバック関数は、$digest サイクルに入ったときにのみ呼び出されます。

したがって、ソケットが接続されると、ダイジェスト サイクルに入ります。 then()新しい promise を作成しますが、その結果は、then()次のダイジェスト サイクルまで伝播されません。@Ajay が投稿したように、$scope.$apply() を追加すると、ダイジェスト サイクルが発生し、結果が表示されます。$timeout$http

于 2013-05-01T18:18:02.950 に答える
8

$scope.$apply() を使用する必要があります。以下の作業コードを見つけてください

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);

                });
            }


        }
于 2013-05-01T18:14:45.687 に答える