如果我从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);
});
}
答案 0 :(得分:25)
在AngularJS中,promise结果在$ digest循环内异步传播。因此,只有在进入$ digest循环时才会调用使用then()注册的回调函数。
因此,当您的套接字连接时,我们处于摘要周期。 then()
会创建一个新的承诺,但then()
的结果将不会传播,直到下一个摘要周期,从未到来(因为没有$timeout
或$http
或触发一个DOM事件)。正如@Ajay刚刚发布的那样,如果你添加$ scope。$ apply(),它将导致一个摘要周期,你会看到结果。
答案 1 :(得分: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);
});
}
}