Javascript 在AngularJS中使用promises和WebSocket

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

我有这个JS代码:

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。我保证;)