【问题标题】:Passing socket as a Socket.io Param?将套接字作为 Socket.io 参数传递?
【发布时间】:2014-07-24 02:23:03
【问题描述】:

总的来说,我有以下工作流程:

  1. 用户请求具有特定标题的文章
  2. 客户端,Socket.io 发出事件并将标题作为数据传递
  3. 服务器端,节点向 API 发出 http 请求并收集有关该文章的相关信息
  4. 完成后,服务器将该信息发送给客户端。

由于 4 取决于 3,我的理解是它需要在回调中捕获以实现同步行为。这给了我这个:

io.on('connection', function(socket){
  socket.on('need data', function(msg) {
    getLinkBacks(msg, socket);
  });
});


var getLinkBacks = function(title, socket) {
  request.get(/* relevant url */, function(err, res, body) {
    socket.emit("data", body);
  });
};

socket.io 文档都没有讨论异步方法,传递套接字而不是回调函数感觉很奇怪,这更像是 Node-y。我是在使用糟糕的技术还是对问题的思考有误,或者这是发出异步方法响应的标准方式?

注意:我会将此放在 Code Review 上,但他们没有 Socket.IO 的标签,这让我觉得它更适合这里。

【问题讨论】:

    标签: node.js socket.io node-request


    【解决方案1】:

    我同意你的观点,Node 的风格是传递一个回调函数,所以我将这段代码重写如下:

    io.on('connection', function(socket){
      socket.on('need data', function(msg) {
        getLinkBacks(msg, function(content) {
          socket.emit("data", content);
        });
      });
    });
    
    
    var getLinkBacks = function(title, fn) {
      request.get(/* relevant url */, function(err, res, body) {
        fn(body);
      });
    };
    

    这将使您的应用程序的每个部分保持隔离,并且getLinkBacks 函数将不必知道socket 是什么。这当然是一个很好的编程习惯。此外,您可以在应用程序的其他部分重用 getLinkBacks 函数,这些部分与 socket 对象无关。

    P.S. 我会推荐 Robert Martin 的“Clean Code: A Handbook of Agile Software Craftsmanship”。他就如何构建代码以使其“干净”提供了非常有价值的建议。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多