JQuery deferred and websocket



我是websocket和延迟函数的新手,所以如果这很愚蠢,请原谅我。

据我了解,延迟是在启动一个函数时使用的,并希望在第一个函数完成后再次启动。

我有一个发送两个事件的 websocket。在客户端,调用 ajax 请求以获取要插入到页面中的 html 代码。我需要在插入第二个事件中的 firs 事件代码之前插入来自其 ajax request 的 firs 事件代码。第一个并不总是发送,但是当它是 2 个事件非常关闭时,我得到了:

  • 接收 EVT1
  • 接收 EVT2
  • 构造 HTML2
  • 构造 HTML1

所以我想在 evt2 代码完成后执行 evt1 代码。

  • 接收 EVT2
    • 如果收到 EVT1 但未结束,请等待
    • 否则执行

更新

这是我解决问题的方法,不知道这是否是最好的方法,但它有效。

var evt1_promise = 0 ;
function evt1_fct(topic, data)
{
 evt1_promise = $.Deferred() ;
 $.ajax({ type: "POST",  url: "php/html_evt1.php", async: false }).done(function(data) { $(".Container").html(data) ; evt1_promise.resolve() }) ;
}
function evt2_fct(topic, data)
{
 // In case there's no event 1 started
 if(!evt1_promise)
 {
  evt1_promise = $.Deferred() ;
  evt1.resolve() ;
 }
 evt1_promise.done(function()
 {
  $.ajax({ type: "POST",  url: "php/quizz_start.php", data: datas, async: false }).done(function (data) { $(".Quizz").html(data) } }) ;
 }) ;
}

我会使用Async.js https://github.com/caolan/async。一个很棒的库,用于发出异步请求并在结果进入时处理结果。对于您的情况,您可以使用 Async.parallel,它将触发两个请求并在两个结果都进入时调用回调(在结果数组中)。

或者,如果您不想使用库,则可以缓存每个 ajax 调用的结果,然后在每次调用返回时运行检查,以确保仅在两个调用完成后构造 html:

  • 有一个检查结果数组大小的回调
  • 将此作为回调传递给两个 AJAX 请求
  • 当结果数组大小为 2(或您发出的请求数)时,运行 HTML 构造代码
如果你想

将jQuery Deferred用于websockets,请查看 https://github.com/jbloemendal/jquery-simple-websocket。

您可以执行以下操作:

var webSocket = $.simpleWebSocket({ url: 'ws://127.0.0.1:3000/' });
webSocket.listen(function(message) {
    console.log(message.text);
});
webSocket.send({ 'text': 'hello' }).done(function() {
   // message send
}).fail(function(e) {
   // error sending
});

相关内容

  • 没有找到相关文章

最新更新