【问题标题】:WebSockets control flow using PromisesWebSockets 使用 Promises 控制流
【发布时间】:2016-08-13 09:58:24
【问题描述】:

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

由于 WebSockets 缺少状态代码/错误管理,并且只是返回带有可选回调的 JSON,因此我必须实现此错误管理。 当错误发生时,我想要一个一致的行为,而不是手动进行这个错误检查,我想包装它以使用 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]
}

我认为使用 Promises 而不是回调来处理 WebSockets 是一项基本且令人讨厌的要求,但由于某种原因,我发现的所有库都没有使用 Promises 包装回调,这导致我问题是我是否遗漏了什么?

谢谢

【问题讨论】:

  • 为什么不写自己的承诺?
  • @jfriend00 有一种内置的方式来支持使用回调的响应/确认,因此不需要标记socket.io/docs/#sending-and-getting-data-(acknowledgements)
  • @JaromandaX 首先要做的事情-我已经实现了它并且我没有要求它,我只是觉得我错过了一些东西。仔细看看我的问题 - 我在问推荐的 JSON 结构是什么,是否有适合我的情况的库,想知道我是否将 websockets 用于基于请求-响应的 API 是错误的,因为似乎缺乏解决方案.
  • @JaromandaX 老实说,我忘记了我可以从这台计算机访问源代码,尽管我认为实现可能无关紧要,因为这里的问题是设计以及是否请求响应websockets 的 API(用 Promises 包装)是正确的,或者我正在尝试做一些不应该做的事情,因为我找不到资源和库来解决这个问题。

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


【解决方案1】:
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()”。

【讨论】:

    【解决方案2】:

    这是我迄今为止在客户端实现它的方式(未经测试),不确定是否有更好的库或解决方案来解决基于 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);
    })
    

    ;

    【讨论】:

      猜你喜欢
      • 2019-01-08
      • 2016-08-08
      • 1970-01-01
      • 2014-05-14
      • 2013-11-03
      • 2023-03-16
      • 1970-01-01
      • 2013-12-06
      • 2015-05-15
      相关资源
      最近更新 更多