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