6

假设我们有一个简单的回显服务器(在第一次请求时调整为更长):

var waiting = 8000;
io.on('connection', function(socket){   
    socket.on('doEcho', function (data) {
        setTimeout( function () {
            socket.emit('echoDone', data);
        }, waiting);
        waiting = 1;
    });
});

然后说一个index.html客户端脚本:

askEcho ("11111", function (resp) {
         console.log("answer for 11111 " + resp);
});
askEcho ("22222", function (resp) {
         console.log("answer for 22222 " + resp);
});

以下错误函数在哪里askEcho,伪装成 RPC 存根:

function askEcho (text, fun) {
     socket.emit('doEcho', text);
     socket.on('echoDone', function (data) {
         fun ( data );
     });
  }

显然我得到的是以下混乱

接听 11111 22222
回答 22222 22222
回答 11111 11111
接听 22222 11111

因为我为同一个事件安装了两个监听器。这可以很容易地解决,但我不清楚如何在客户端正确排序响应,而无需服务器端的帮助(更多编程)。

这一切似乎有点太多的负担。不能askEcho正确和容易地编码功能吗?

4

2 回答 2

4

实际上,有一个简单的技巧:使用计数器来区分答案,并在完成后删除回调(甚至更好地使用once而不是on)。这只会在服务器端和客户端造成微小的变化。

让我们展示一下:

回声服务器是(现在没有任何延迟超时):

io.on('connection', function(socket){   
    socket.on('doEcho', function (callCounter, data) {    
        socket.emit('echoDone'+callCounter, data);
    });
});

在客户端 ( index.html) 中,用户代码仍然是相同的,根据需要:

askEcho ("11111", function (resp) {
    console.log("answer for 11111 " + resp);
});
askEcho ("22222", function (resp) {
    console.log("answer for 22222 " + resp);
});

这是与服务器端团队合作正常工作的存根askEcho

var callCounter = 0;
function askEcho (text, fun) {
     var localCallCounter = ++callCounter;
     socket.emit('doEcho', localCallCounter, text);
     socket.once('echoDone'+localCallCounter, function (data) {
         // not required: socket.removeListener ('echoDone'+localCallCounter);
         fun ( data );
     });
 }
于 2014-05-31T14:46:08.940 回答
3

使用 socket.io,您可以通过回调发送和接收确认。

看到这个:http://socket.io/docs/#sending-and-getting-data-(acknowledgements)

于 2015-04-21T22:20:11.403 回答