WebSockets使用Promises

时间:2016-08-13 09:58:25

标签: javascript angularjs node.js websocket socket.io

我目前正在使用Node.js作为服务器(Express.js)和客户端的AngularJs,从基于HTTP的API切换到WebSockets(使用Socket.io),以提高性能。

由于WebSockets缺少状态代码/错误管理,只是通过可选的回调返回JSON,我必须实现此错误管理。 当发生错误时我想要一致的行为,而不是手动检查这个错误我想包装它以减少我的代码中的boilplate使用Promises而不是基于旧的回调。

例如,而不是在angular:

中使用原始socket.io
socket.emit('users/read', {id: 2}, function handleResponse(res){
    if(res.success){
        var user = res.data;
        socket.emit('projects/by-user', {userId: user.id}, function handleResponse(res){
            if(res.success){
                var projects = res.data;
                // Do something with the data
            } else{
                // Error getting user's projects
                console.log(res.error)
            }
        })
    } else{
        // Error getting user
        console.log(res.error)
    }
})

我想有这样的事情:

webSocketClient
    .request('users/read', {id:2})
    .then(function(user){
        return webSocketClient.request('projects/by-user', {userId: user.id})
    })
    .then(function(projects){
        // Do something with projects
    })
    .catch(function(err){
        // Something went bad
    })

在实现基于请求 - 响应WebSockets的API时,推荐的JSON结构是什么?或者有一个库可以为我做这个吗?

我目前正在考虑使用此结构的JSON:

{
    success: true/false,
    data: [if exists],
    statusCode: [default 200 for success or 500 for failure],
    error: [if exists]
}

我认为使用Promise而不是回调来处理WebSockets是一个基本而且需要的,但由于某些原因,我发现所有的库都没有用Promises包装回调,这导致了如果我错过了什么,我会回答这个问题吗?

由于

2 个答案:

答案 0 :(得分:0)

var ownhandler={};
ownhandler.request(query){
o={};
o.query=query;
o.then=function (callback){
    calltheserver(this.query,function(){
      callback();
     }
 };
 return o;
 }

我不确定它是否是你想要的,但现在你可以这样做:

ownhandler.request("whatever").then(function(){
 //function finished
 }

但是你必须更换" calltheserver()"具有实际功能。

答案 1 :(得分:0)

以下是我到目前为止在客户端实现它的方式(未经测试),不确定是否有更好的库或解决方案来解决基于Websocket的请求 - 响应API。

客户端代码(Angular.js)

angular.module('app.web-sockets', [])
.factory('wsClient', function createWebSocketClient(socket, $q, assert, $timeout) {
    function WebSocketClient(socket) {
        this._socket = socket;
    }

    WebSocketClient.prototype.request = function request(url, data, options) {

        var wrappedRequest = {
            data: data
        };

        var deferred = $q.defer();
        var resolved = false;

        socket.emit(url, wrappedRequest, function responseCallback(response) {
            if (response.success) {
                deferred.resolve(response.data);
                resolved = true;
            } else {
                deferred.reject(response);
                resolved = true;
            }
        });

        return deferred.promise;
    };

    return new WebSocketClient(socket);
})