将套接字作为Socket.ioparameter passing?

一般来说,我有以下工作stream程:

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

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

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文档谈论asynchronous方法,而且传递套接字感觉很奇怪,而不是一个callback函数,它会更多的Node-y。 我是使用差的技术还是考虑错误的问题,或者这是发出asynchronous方法响应的标准方式?

注意:我将这个放在Code Review上,但是它没有Socket.IO的标签,这让我觉得在这里比较适合。

我同意你,Node的风格是传递一个callback函数,所以我会重写这段代码如下:

 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对象连接。

PS我会推荐Robert Martin的“ Clean Code:敏捷软件工匠手册 ”。 他给出了非常有价值的build议,关于如何构build代码以使其“干净”。

祝你好运!