在Angular JS中没有调用Promise回调

dnd*_*ndr 10 websocket jquery-deferred angularjs

如果我把connectdoStuff,我得到的消息"套接字连接",但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);
    });
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*cok 25

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

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


Aja*_*wal 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);

                });
            }


        }
Run Code Online (Sandbox Code Playgroud)