dnd*_*ndr 10 websocket jquery-deferred angularjs
如果我把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);
});
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*cok 25
在AngularJS中,promise结果在$ digest循环内异步传播.因此,只有在进入$ digest循环时才会调用使用then()注册的回调函数.
因此,当您的套接字连接时,我们处于摘要周期. then()
创建一个新的promise,但是它的结果then()
将不会传播到下一个摘要周期,它永远不会到来(因为没有$timeout
,or $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);
});
}
}
Run Code Online (Sandbox Code Playgroud)