5

我有以下代码(来自 spring websocket 演示应用程序):

    stompClient.connect({}, function(frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/user/queue/greeting', function(greeting) {          
            displayQueueMessage(greeting);
        });

    function sendName() {
      var name = document.getElementById('name').value;
      stompClient.send("/app/wsdemo", {}, JSON.stringify({
        'name' : name
       }));
    }

这是对服务器上队列的简单订阅调用,另一个发送调用服务器的方法“sendName()”。

调用 sendName 后,服务器响应 connect 方法提供的回调函数:

function(greeting) {            
    displayQueueMessage(greeting);
});

我的问题是 - 客户应该从subscribe呼叫等待多长时间才能开始呼叫sendName?我的意思是,我可以在这里看到的潜在问题如下:

i) 客户端首先订阅队列,

ii) 客户端调用 sendName

iii)服务器在收到订阅呼叫之前收到第二个呼叫。

iv) 客户端不会收到来自服务器的响应。

我的问题:

1)这种情况真的是一个问题吗?

2)我怎样才能避免它?

3)我在某处读到,由于 websocket 与 tcp 一起使用,消息的顺序得到了维护,所以我的最后一个问题是 - 对于没有 websocket 支持的客户端,stompJS 的后备功能怎么样?订单也会维持吗?

4

2 回答 2

0

由于您在连接阶段订阅了队列,因此您只需等待连接建立,然后再向服务器发送请求。

于 2014-07-23T14:11:40.843 回答
0

我想你解决了你的问题,现在知道什么是异步的承诺、回调和 javascript。

订阅时:

  stompClient.subscribe('/user/queue/greeting', function(greeting) {          
        displayQueueMessage(greeting);
    });

您将回调函数作为第二个参数传递,并且仅当订阅发生(成功请求)时,您的回调才会被执行。

如果您将调用sendName()回调或使用任何其他方法来同步这两个点,则可以避免它。

于 2015-01-15T09:19:22.493 回答