Angular JS中未调用的Promise回调



如果我从doStuff调用connect,我得到消息"套接字已连接",但没有调用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);
    });
}

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

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

你应该使用$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);
                });
            }

        }

相关内容

  • 没有找到相关文章

最新更新