我有用于聊天目的的用户列表,类似于在facebook上,我使用ngResource从我的数据库中获取所有用户。当用户离线时,我的红色标记靠近他的名字,在线时我使用绿色标记。
我想要的是,当用户登录时,我的红色标记将变为绿色。当用户登录我的应用程序时,我的Hub方法OnConnected()被触发并调用我的客户端代码
用户登录时的集线器方法。
#region Connect
public override Task OnConnected()
{
var userDetails = new ApplicationUser
{
ConnectionId = Context.ConnectionId,
UserName = Context.Request.GetHttpContext().User.Identity.Name,
Id = HttpContext.Current.User.Identity.GetUserId(),
};
if (onlineUsers.Count(x => x.ConnectionId == userDetails.ConnectionId) == 0)
{
onlineUsers.Add(new ApplicationUser {
ConnectionId = Context.ConnectionId,
UserName = userDetails.UserName,
Id = userDetails.Id,
});
Clients.All.newOnlineUser(userDetails);
Clients.Caller.getOnlineUsers(onlineUsers);
}
return base.OnConnected();
}
#endregion
我的控制器中的客户端代码
$scope.online_users = UserService.getChatUsers();
PrivateChatService.addOnlineUser(function (user) {
angular.forEach($scope.online_users, function (value, key) {
if (user.UserId == value.Id) {
value.Active = true;
}
});
console.log("newOnlineUser finished");
});
问题在于我的客户端代码中的forEach方法。在那个时候,当我的signalR集线器触发我的方法“.addOnlineUser”时,我的$ scope.online_users没有被解析,所以我只有承诺而不是数据所以我不能遍历该数组以将用户状态从离线更改为在线。我是如何等待承诺得到解决的?
更新 我有类似的东西,但这并不是很好的方法,因为我一直打我的数据库来获得用户。
PrivateChatService.addOnlineUser(function (user) {
var dataPromise = UserService.getChatUsers(function(response){
$scope.online_users = response;
angular.forEach(dataPromise, function (value, key) {
if (user.UserId == value.Id) {
value.Active = true;
}
});
});
console.log("newOnlineUser finished");
});