angularJS socket
工程Controller加载文件Service层socket.js.controller所在页面时连接socket(也可一进入项目就连接,看需求)。细节还需继续优化,写下来以防忘了~
Service层:socket.js
/*************************************************************
******************Angular Websocket Service******************
******************author:ristal******************************
******************created:2014-04-01**************************/
angular.module('websocketService', [])
.service('sWSocket', ['$timeout', function ($timeout) {
var self = this;
var callbackPool = []; //onMessage分类处理函数
var delayPool = []; //延迟处理请求
var registerPool = [];//已注冊的方法
var data = {};
var ws = null;
var connected = false; function newWebSocket() {
// var wsURL = "ws://10.188.199.4:8080/YIXUN_1.5_WEB/websocket/";
var wsURL = "ws://10.188.192.200:8000/websocket/";
var wsTmp = new WebSocket(wsURL);
wsTmp.onopen = function (evnt) {
onOpen(evnt)
};
wsTmp.onmessage = function (evnt) {
onMessage(evnt)
};
wsTmp.onclose = function (evnt) {
onclose(evnt)
};
wsTmp.onerror = function (evnt) {
onError(evnt)
};
return wsTmp;
} ws = newWebSocket(); function onOpen() {
ws.readyState = true;
updateStatus("onOpen : " + (connected ? 'TTRRUUEE' : 'FFAALLESS')); //缓存池中存在请求
while (delayPool.length > 0) { var popData = delayPool.shift();
if (popData.isReg == 1) {
self.register(popData.appId, popData.methodId, popData.scope, popData.callbackFuns);
} else if(popData.isReg == 0){
self.unRegister(popData.appId, popData.methodId, popData.scope, popData.callbackFuns);
}else {
self.send(popData.appId, popData.methodId, popData.content);
}
}
} function onclose() {
ws.readyState = false;
updateStatus("onClosed : " + (connected ? 'TTRRUUEE' : 'FFAALLESS'));
$timeout(function () {
console.log('Reconnecting to server...')
newWebSocket();
}, 3000);
} function onMessage(evnt) {
//这里处理接收数据
var evenData = JSON.parse(evnt.data);
console.log("Received data from websocket: ", evenData); // //返回处理
// if(evenData.appId === 'register')
// {
// if(evenData.methodId === 'unRegister'){
// //方法返回成功,增加方法池
// if(evenData.content.status == 'SUCCEED'){
// //registerPool.push({appId: evenData.content.appId, methodId: evenData.content.methodId});
// console.log("registerPool:", registerPool);
// }else{//方法返回失败,又一次发送请求
//
// }
// }
// } //运行回调函数
//传回后端实时推送的数据
<span style="color:#ff0000;"> angular.forEach(callbackPool,function(value){
if(value.appId === evenData.appId && value.methodId === evenData.methodId){
value.callback(evenData.content);
}
});</span>
} function onError(evnt) {
ws.readyState = false;
console.log('ERROR: ', evnt);
$timeout(function () {
console.log('Reconnecting to server...')
newWebSocket();
}, 3000);
} function updateStatus(status) {
console.log(status);
} //注冊方法
//注冊成功后会一直监听后端推送的对应部分的数据
//直到注销此方法
self.register = function (appId, methodId, callbackFuns) { var webSocketRe = {};
webSocketRe.appId = 'register';
webSocketRe.methodId = 'register';
webSocketRe.content = {
appId: appId,
methodId: methodId
}; if (ws.readyState != true){//websocket服务未打开
webSocketRe.isReg = 1;//register
webSocketRe.appId = appId;
webSocketRe.methodId = methodId;
webSocketRe.callbackFuns = callbackFuns;
delayPool.push(webSocketRe);
console.log("register-delayPool:", delayPool);
console.log("sending is delay.");
return "sending is delay.";
} else {
callbackPool.push({appId:appId,methodId:methodId,callback:callbackFuns});
console.log("callbackPool:",callbackPool);
return doSend(webSocketRe);
}
} //注销方法
//通知后端不再推送对应数据
self.unregister = function (appId, methodId,callbackFuns) {
console.log("unregister");
var webSocketRe = {};
webSocketRe.appId = 'register';
webSocketRe.methodId = 'unRegister';
webSocketRe.content = {
appId: appId,
methodId: methodId
}; //websocket服务未开启
if (ws.readyState != true){
webSocketVo.isReg = 0;//unRegister
delayPool.push(webSocketRe);//
console.log("unregister is delay.");
return "unregister is delay.";
} else {
console.log("sending unregister.");
var num = 0; //循环检查回调函数池
angular.forEach(callbackPool,function(value,key){
if(value.appId === appId && value.methodId === methodId){
num += 1;
if(value.callback === callbackFuns){
delete callbackPool[key];
num -=1;
}
}
});
console.log("num:",num);
console.log("callbackpool:",callbackPool); //回调函数池中已经不存在此方法才真正发送websocket请求
//通知后端不再推送对应数据
if(num === 0 ){
doSend(webSocketRe);
}
}
} //实际发送websocket请求
function doSend(webSocketVo) {
return ws.send(JSON.stringify(webSocketVo));
} self.send = function (appId, methodId, content) {
var webSocketVo = {};
webSocketVo.appId = appId;
webSocketVo.methodId = methodId;
webSocketVo.content = content;
if (ws.readyState == 0) {
// webSocketVo.isReg = false;//不须要注冊
delayPool.push(webSocketVo);
console.log("sending is delay.");
return "sending is delay.";
} else {
console.log("sending is doing.");
console.log("webSocketVo:",webSocketVo);
return doSend(webSocketVo);
}
}
return self;
}]);
Controller层:
<pre name="code" class="javascript">/*************************************************************
******************Angular Websocket Controller****************
******************author:ristal******************************
******************created:2014-04-01**************************/ angular.module('websocketControllers')
.controller('loginCtrl', function ($scope,loginFactory,sWSocket,toaster,$location,$timeout) {
console.log("loginCtrl"); $scope.status; var appId = 'heartBeat';
var methodId = 'heartBeat';
var callback = function(evendata){
console.log("callback:",evendata);
$scope.menu = evendata;
$scope.$apply();
console.log($scope.menu);
}
var callback1 = function(evendata){
console.log("callback1:",evendata);
$scope.menu = evendata;
$scope.$apply();
console.log($scope.menu);
} $scope.doLogin = function(user){
loginFactory.doLogin(user)
.success(function (success) {
if(success.resultCode == 200){ $scope.status = '登录成功';
console.log("doLogin");
$location.path('/home'); var content2 = {
userName:'hmm',
userPassword:'111'
};
//websocket登陆
sWSocket.send('login', 'doLogin', content2); //考虑极端情况。一个页面有多个模块监听同一个方法
//但展示在页面的数据需对接收的实时监听的数据做不同处理 //登陆后注冊方法heartBeat。回调函数callback
//页面切换时(也就是注销scope时)才注销此方法
sWSocket.register(appId,methodId,callback); //登陆后也注冊方法heartBeat,回调函数callback1
//3s后马上注销此方法
sWSocket.register(appId,methodId, callback1);
$timeout(function () {
console.log("unregister callback1");
sWSocket.unregister(appId,methodId,callback1);
}, 3000); }else if (success.resultCode == 102) {
toaster.pop('error', "操作失败", success.resultReason);
$scope.status = success.resultReason;
}; })
.error(function (error) {
$scope.status = '登录失败: ' + error.message;
});
}; $scope.logout = function(){
loginFactory.logout()
.success(function () {
$scope.status = '退出成功';
console.log("logout");
})
.error(function (error) {
$scope.status = '退出失败: ' + error.message;
});
}; //注销scope时注销方法heartBeat。回调函数callback
$scope.$on("$destroy",function(){
console.log("on-destroy");
sWSocket.unregister(appId,methodId,callback);
}); });
版权声明:本文博客原创文章,博客,未经同意,不得转载。
angularJS socket的更多相关文章
- AngularJS+Node.js+socket.io 开发在线聊天室
所有文章搬运自我的个人主页:sheilasun.me 不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍 ...
- 利用Angularjs测试引擎Karma进行自动化单元测试
Karma是Google用于angularjs框架单元测试的js引擎(javascript test runner ), angular1 和angular2项目源码的单元测试都是基于karma和ja ...
- Angularjs学习---ubuntu12.04中karma安装配置中常见的问题总结
karma启动时出现了很多问题: 1.安装karma前提条件 安装karma首先要安装nodejs,npm然后才可以安装karma.nodejs,npm的安装过程可以参考文章:Angularjs学习- ...
- AngularJS学习--- AngularJS中的模板template和迭代器过滤filter step2 step3
1.AngularJS 模板---step2: mvc(Model-View-Controller)模式在后端用的比较多,在前端也是一样的常用; 在AngularJS中,一个视图是模型通过HTML模板 ...
- AngularJS 中文资料+工具+库+Demo 大搜集
中文学习资料: 中文资料且成系统的就这么多,优酷上有个中文视频. http://www.cnblogs.com/lcllao/archive/2012/10/18/2728787.html 翻译的 ...
- angularJS测试一 Karma Jasmine Mock
AngularJS测试 一 测试工具 1.NodeJS领域:Jasmine做单元测试,Karma自动化完成单元测试,Grunt启动Karma统一项目管理,Yeoman最后封装成一个项目原型模板,npm ...
- 基于Karma和Jasmine的AngularJS测试
1:工程目录结构 y@y:karma-t01$ tree -L 3.├── client│ ├── app│ │ └── user│ ├── bower_components│ │ ...
- socket.io+angular.js+express.js做个聊天应用(四)
接着上一篇 使用angularjs构建聊天室的client <!doctype html> <html ng-app="justChatting"> < ...
- Angularjs学习---ubuntu12.04中karma安装配置
Angularjs学习---ubuntu12.04中karma安装配置中常见的问题总结 karma启动时出现了很多问题: 1.安装karma前提条件 安装karma首先要安装nodejs,npm然 ...
随机推荐
- uvaLive5713 次小生成树
uvaLive5713 修建道路使得n个点任意两点之间都可以连通,每个点有都有一定的人口,现在可以免费修一条道路, A是免费修的道路两端结点的人口之和, B的其它不是免费修道路的长度的总和 要求的是A ...
- nginx subrequest演示示例程序
只有简单subrequest应用演示示例. nginx.conf文件: #user nobody; worker_processes 1; #error_log logs/error.log; #er ...
- 为什么不要在android或者ios上直连mysql或者sqlserver之类的数据库(跳大神)
很多同学 都有直连这些数据库的想法,假设我说了下面二个问题之后你还想直连,那我也没办法 数据库是一个服务端最重要的部分,也是最脆弱的部分,更是最敏感的部分 假设直连会造成例如以下问题 1.安全问题,你 ...
- Android使用百度定位SDK方法及错误处理
下面事例是使用Android平台的部分代码.对于这个平台百度的开放人员已经写了完整的demo,把工程导入到eclipse中之后一般没有错误,如果报错的话,eclipse也会给出提示.一般可以通过将pr ...
- ios 仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View.
仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View. 实现原理,UINavigationController 的 self.view显示时把当前显示的vie ...
- Windows Server 2012 R2在桌面上显示计算机/网络图标
原文 Windows Server 2012 R2在桌面上显示计算机/网络图标 从Windows2012开始,微软取消了服务器桌面个性化选项,如何重新调出配置界面,可以使用微软命令调出.具体方法如下: ...
- Android的ViewAnimator而它的子类ViewSwitcher-android学习之旅(三十三)
ViewAnimator遗传FrameLayout,重合使用多个组件.可以增加部件数量,然后会有时间切换动画. ViewAnimator及其子类的继承关系 ViewAnimator经常使用属性 Vie ...
- hdu 3333 树状数组+离线处理
http://acm.hdu.edu.cn/showproblem.php?pid=3333 不错的题,想了非常久不知道怎么处理,并且答案没看懂,然后找个样例模拟下别人的代码立即懂了---以后看不懂的 ...
- laydate天蓝色的皮肤
要使用该网站日期控件.就到网上找laydate,但laydate无天蓝色的肌肤,其他皮肤不能进行集成和现场,对自己做了一个天蓝色的肌肤,分享给大家使用. 皮肤下载 版权声明:本文博主原创文章.博客,未 ...
- hdu 2899 hdu 3400 三分/几何
hdu2899 : 水提,直接三分,事实上求导后二分也能够. #include<iostream> #include<cstdio> using namespace std; ...