将套接字作为Socket.ioparameter passing?
一般来说,我有以下工作stream程:
- 用户请求具有特定标题的文章
- 客户端,Socket.io发出一个事件并将标题作为数据传递
- 服务器端,节点向一个API发出一个http请求,并收集关于该文章的相关信息
- 完成后,服务器将该信息发送给客户端。
由于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代码以使其“干净”。
祝你好运!