forked from rongcloud/websdk-demo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
user-group.js
221 lines (182 loc) · 6.25 KB
/
user-group.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*
CMD规范: https://github.com/seajs/seajs/issues/242
AMD规范: https://github.com/amdjs/amdjs-api/wiki/AMD
requirejs: http://requirejs.org/docs/whyamd.html
*/
/*
集成用户和群组数据的代码参考
主要为了演示思路,具体有些实现还需要自行处理
功能:
1:根据 userId 获取用户信息 (用户的 id、name、portrait)
2:根据 groupId 获取群组信息(群组的 id、name、portrait、memberIds)
*/
//namespace 请使用时具体定义
;(function (global, factory, namespace) {
if(typeof exports === 'object' && typeof module !== 'undefined'){
module.exports = factory();
}else if(typeof define === 'function' && define.amd){
define(factory);
}else{
global.RongIM = global.RongIM || {};
global.RongIM.AppData = factory();
}
})(window, function(){
"use strict";
var APIs = {};
var domain = "http(s)://yourdomain";
APIs.userInfo = "/user/{ids}";
var userInfos = [
{
"id" : "userId1",
"name" : "张三",
"portrait" : "http://rongcloud.cn/images/newVersion/log_wx.png?1"
},
{
"id" : "userId2",
"name" : "李四",
"portrait" : "http://rongcloud.cn/images/newVersion/log_wx.png?2"
},
{
"id" : "userIdN",
"name" : "路人甲乙丙丁",
"portrait" : "http://rongcloud.cn/images/newVersion/log_wx.png?3"
}
];
/*
获取用户信息接口,建议支持批量获取,如不支持,只能通过循环请求处理,后面会有示例
上行:ids = ["userId1","userId2",………………,"userIdN"].join(",");
返回:userInfos
*/
APIs.groupInfo = "/group/{ids}";
var groupInfos = [
{
"id" : "groupId1",
"name" : "产品研发群",
"portrait" : "http://rongcloud.cn/images/newVersion/log_wx.png",
"memberIds" : ["userId1","userId2"]
},
{
"id" : "groupIdN",
"name" : "项目管理群",
"portrait" : "http://rongcloud.cn/images/newVersion/log_wx.png",
"memberIds" : ["userId1","userIdN"]
}
];
/*
获取群组信息接口,建议支持批量获取,如不支持,只能通过循环请求处理,后面会有示例
上行:ids = ["groupId1",………………,"groupIdN"].join(",");
返回 groupInfos
*/
//请求方法,只给出成功返回的情况,异常请自行处理
var request = function(url, pramas, callback){
/*
请自行实现请求,或者传入 jQuery 等 lib 的 request 方法
请注意处理可能存在的跨域问题
*/
//返回mock数据,实际工程中请基于应用服务器实现
if(url.indexOf("/group/") > -1){
callback(groupInfos);
}else{
callback(userInfos);
}
}
//创建本地缓存对象,缓存用户数据,目前放在内存,具体使用时可以根据需要处理为 localStorage 或 cookie 等
window.userInfoCache = window.userInfoCache || {};
//获取用户信息方法的实现
var getUserInfos = function(ids, callback){
//考虑到具体的应用场景,设计为 object,也可以根据业务特点设计成 array 等其他的数据格式
var userInfos = {};
var remoteUserIds = [];
for(var i = 0, len = ids.length; i<len; i++){
var userId = ids[i];
if(userInfoCache[userId]){
//如果本地命中,直接放入结果等待一起返回
userInfos[userId] = userInfoCache[userId];
//如果需要立即返回,这种方法会不断执行回调,逐个返回,如下面,此处以及request里的返回均可如此处理
// callback({userid:userInfoCache[userId]});
}else{
//如果本地没有命中,过滤出 id,下一步从服务器请求
remoteUserIds.push(userId);
}
}
var url = domain + APIs[userInfo];
//支持批量请求,返回用户数据
request(url, remoteUserIds, function(remoteUserInfos){
for(var i = 0, len = remoteUserInfos.length; i<len; i++){
var userInfo = remoteUserInfos[i];
//根据返回值做对应处理
var userId = userInfo["id"];
//放入本地缓存
userInfoCache[userId] = userInfo;
//放入查询结果
userInfos[userId] = userInfo;
callback(userInfos);
}
});
//不支持批量请求,逐个返回用户数据
var backNumbers = 0;
for(var i = 0, len = remoteUserIds.length; i<len; i++){
var remoteUserId = remoteUserIds[i];
request(url, remoteUserId, function(remoteUserInfo){
var userId = remoteUserInfo["id"];
//放入本地缓存
userInfoCache[userId] = remoteUserInfo;
//放入查询结果
userInfos[userId] = remoteUserInfo;
//计数 +1
backNumbers += 1;
//根据 backNumbers 与 remoteUserIds 的长度判断是否全部请求完毕
if(backNumbers == len){
callback(userInfos);
}
});
}
};
//创建本地缓存对象,缓存用户数据,目前放在内存,具体使用时可以根据需要处理为 localStorage 或 cookie 等
window.groupInfoCache = window.groupInfoCache || {};
//获取群组信息实现,本方法不返回群组成员信息
var getGroupInfos = function(ids, callback){
var groupInfos = {};
var remoteGroupIds = [];
for(var i = 0, len = ids.length; i<len; i++){
var groupId = ids[i];
if(groupInfoCache["groupId"]){
//如果本地命中,直接返回
groupInfos[groupId] = groupInfoCache[groupId];
}else{
//如果本地没有命中,过滤出 id,下一步从服务器请求
remoteGroupIds.push(groupId);
}
}
var url = domain + APIs[groupInfo];
//支持批量请求,返回群组数据
request(url, remoteGroupIds, function(remoteGroupInfos){
for(var i = 0, len = remoteGroupInfos.length; i<len; i++){
var groupInfo = remoteGroupInfos[i];
var groupId = groupInfo["id"];
//放入本地缓存
groupInfoCache[groupId] = groupInfo;
//放入查询结果
groupInfos[groupId] = groupInfo;
callback(groupInfos);
}
});
//不支持批量的处理方式与 userInfo 一致,请参考
}
//获取群组信息及成员信息,因为应用场景,此方法设计为逐个群组获取
var getGroupInfosWithMemberInfo = function(id, callback){
getGroupInfo(id, function(groupInfo){
var ids = groupInfo.memberIds;
getUserInfo(ids, function(userInfos){
groupInfo.members = userInfos;
callback(groupInfo);
})
});
}
//返回需要对外暴露的方法
return {
getUserInfos : getUserInfos,
getGroupInfos : getGroupInfos,
getGroupInfosWithMemberInfo : getGroupInfosWithMemberInfo
}
});