0

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

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

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

  • 接收 evt1
  • 接收 evt2
  • 构造html2
  • 构造html1

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

  • 接收 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) } }) ;
 }) ;
}
4

2 回答 2

0

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

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

  • 有一个回调来检查结果数组的大小
  • 将此作为回调传递给两个 ajax 请求
  • 当结果数组大小为 2(或您发出的请求数)时,运行 html 构造代码
于 2013-09-12T16:23:38.143 回答
0

如果您想将 jQuery Deferred 用于 websocket,请查看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
});
于 2016-02-20T20:59:31.817 回答