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()直到下一个摘要周期才会传播,该周期永远不会到来(因为没有$timeout, or $http, or DOM 事件来触发)。正如@Ajay 刚刚发布的那样,如果您添加 $scope.$apply(),它将导致一个摘要循环,您将看到结果。

于 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 回答