【问题标题】:Promise callback not called in Angular JSAngular JS 中未调用承诺回调
【发布时间】:2013-05-01 17:37:32
【问题描述】:

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

【问题讨论】:

  • 我在使用 socket.io @markrajcok 时在 reactjs 中遇到了同样的问题

标签: angularjs websocket jquery-deferred


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我在 reactjs 也有同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多