【问题标题】:How does socketIO handle the functions I give to him?socketIO 是如何处理我给他的功能的?
【发布时间】:2016-03-17 07:39:37
【问题描述】:

这是一个包含angularJs、nodeJs和mongoDb的项目。

我有这个客户端代码:

webSocket.emit('createNode', node, function(node){
                                       /*   ^   */
                            /*  Where does this goes ?  */
    $scope.nodes.push(node);
});

还有这个服务器端代码:

socket.on('createNode', function(node, callback) {
                                    /*    ^    */
                           /*  Where does this comes from ? */
    mongo.connect("mongodb://localhost:27017/test", function(err, db) {
        db.collection('nodes').insertOne(node, function(error, data){
            callback(node);                   
        });                         
    });
});

我想知道 socketIo 如何运行我给他的函数,以及如何在发出成功后执行一段代码而不在服务器端显式调用它。

【问题讨论】:

    标签: angularjs node.js sockets socket.io


    【解决方案1】:

    就是所谓的acknowledgement。您可以在此处查看文档:http://socket.io/docs/#sending-and-getting-data-(acknowledgements)

    这是一个非常简单的想法 - 当您从客户端发出某些内容时,客户端会保存您的确认回调并将其映射到您的特定发出调用。 “发出createNode - 函数(){}”。然后它将信息发送到服务器并标记此发出需要回调。当服务器调用它时,它不是实际调用客户端上的函数,它只是在内部对套接字说“好的,发回确认”。

    Socket.IO 实际上使 another 从服务器返回,因为它被标记为确认,所以客户端会这样对待它。它浏览它创建的地图并调用之前存储的函数。

    这一切都在内部完成,因此您无需编写等待回调的逻辑 - 这一切都在您的后台。

    回到你的最后一个问题 - “我如何在发出成功后执行一段代码”。没有所谓的“发射成功”。客户端确实知道发射是否到达服务器或那里发生了什么。套接字只是一个发送信息的通道——它们不关心接下来会发生什么。这就是它的构建方式。

    如果您需要知道服务器是否收到了您的命令,您必须将该信息发送回客户端。这意味着,就 Socket.IO 而言,您应该使用这些确认并明确通知成功。

    但不要害怕——明确确实意味着您正在调用客户端函数,它只是通知客户端一切顺利并且收到了命令。这种方法非常强大,因为您可以传递有关命令结果的参数,说明它是否有效,结果是否成功。所以去吧,试一试:)

    【讨论】:

      猜你喜欢
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多