socketIO如何处理我给他的功能



这是一个包括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如何运行我给他的函数,以及如何在成功发出后执行一段代码而不显式调用服务器端。

这就是

所谓的acknowledgement。您可以在此处查看文档:http://socket.io/docs/#sending 和获取数据(致谢)。

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

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

这一切都是在内部完成的,这样你就不会为等待回调编写逻辑——这一切都在你身上。

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

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

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

最新更新