Javascript 在AngularJS中使用promises和WebSocket
我有这个JS代码:Javascript 在AngularJS中使用promises和WebSocket,javascript,angularjs,websocket,angular-promise,Javascript,Angularjs,Websocket,Angular Promise,我有这个JS代码: app.factory('ChatWebsocket', function ($q, ChatSocketUrl) { var socket = new WebSocket(ChatSocketUrl); return $q(function (resolve, reject) { socket.onopen = function () { resolve(socket); }; soc
app.factory('ChatWebsocket', function ($q, ChatSocketUrl)
{
var socket = new WebSocket(ChatSocketUrl);
return $q(function (resolve, reject) {
socket.onopen = function () {
resolve(socket);
};
socket.onerror = function (e) {
reject(e);
}
});
});
app.factory('ChatServiceWebsocket', function ($q, ChatWebsocket)
{
function SocketWrapper(socket, action, payload)
{
return $q(function (resolve) {
socket.onmessage = function (e) {
resolve(JSON.parse(e.data));
};
socket.send(JSON.stringify({action: action, payload: payload}));
});
}
return {
login: function (userId, subjectId) {
return ChatWebsocket.then(function (socket) {
return new SocketWrapper(socket, 'login', {user: userId, subject: subjectId});
});
},
rooms: function (userId) {
return ChatWebsocket.then(function (socket) {
return new SocketWrapper(socket, 'rooms', {user: userId});
});
}
};
});
/******************* THE CONTROLLER ***************************/
ChatServiceWebsocket.rooms(userId).then(function (result) {
console.log('ChatServiceWebsocket.rooms = ', result);
});
ChatServiceWebsocket.login(userId, roomId).then(function (result) {
console.log('ChatServiceWebsocket.login = ', result);
});
我希望在控制台中看到:
ChatServiceWebsocket.rooms = [Object ... room list]
ChatServiceWebsocket.login = [Object ... login data]
但我只看到最后一个调用,输出无效:
ChatServiceWebsocket.login = [Object ... room list]
无法使此ChatServiceWebsocket正常工作:(可能是因为您使用了ChatWebsocket的一个实例。如果您调用login,可能会覆盖rooms的承诺。如果承诺完成,则只会调用第二个函数,这是第一次查询的结果。我目前无法验证这一点……但这可能会给您一个可能的提示。或者不是。)我需要重新使用WebSocket连接,这样它就不会每次都重新连接到服务。我不知道这是否正确,但是ChatWebsocket创建了一个套接字,这是可以的。但是看起来,它也只创建了一个承诺?你能试着为ChatWebsocket添加一个函数,用于新的请求,并且该函数应该为每个请求返回一个新的$q承诺吗请求…如果你能提供一个工作的小提琴或一些东西…我可以试着向你展示我的意思。我会试试看,为了确保RxJS,观测值比承诺更适合WebSocket。我保证;)