在Angular JS中没有调用Promise回调

时间:2013-05-01 17:37:32

标签: angularjs websocket jquery-deferred

如果我从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);
    });
}

2 个答案:

答案 0 :(得分:25)

在AngularJS中,promise结果在$ digest循环内异步传播。因此,只有在进入$ digest循环时才会调用使用then()注册的回调函数。

因此,当您的套接字连接时,我们处于摘要周期。 then()会创建一个新的承诺,但then()的结果将不会传播,直到下一个摘要周期,从未到来(因为没有$timeout$http或触发一个DOM事件)。正如@Ajay刚刚发布的那样,如果你添加$ scope。$ apply(),它将导致一个摘要周期,你会看到结果。

答案 1 :(得分: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);

                });
            }


        }