Обратный вызов Promise не вызывается в Angular JS

Если я вызываю 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);
    });
}

person dndr    schedule 01.05.2013    source источник
comment
У меня такая же проблема в reactjs при использовании socket.io @markrajcok   -  person srinivas    schedule 07.09.2016


Ответы (2)


В AngularJS результаты промисов распространяются асинхронно, внутри цикла $digest. Таким образом, ваша функция обратного вызова, зарегистрированная с помощью then(), будет вызываться только при входе в цикл $digest.

Итак, когда ваш сокет подключается, мы находимся в цикле дайджеста. then() создает новое обещание, но результаты этого then() не будут распространяться до следующего цикла дайджеста, который никогда не наступит (поскольку нет $timeout, $http или события DOM, которое бы его инициировало). Как только что написал @Ajay, если вы добавите $scope.$apply(), это вызовет цикл дайджеста, и вы увидите результаты.

person Mark Rajcok    schedule 01.05.2013

Вы должны использовать $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);

                });
            }


        }
person Ajay Beniwal    schedule 01.05.2013
comment
У меня такая же проблема в реакции - person srinivas; 07.09.2016