【问题标题】:Back-to-back ajax long poll without a recursive callback function没有递归回调函数的背靠背ajax长轮询
【发布时间】:2010-04-10 04:15:38
【问题描述】:

我正在尝试进行长轮询 ajax 调用,背靠背。我目前这样做的问题是我从前一个调用的回调函数中进行了每个连续的调用。这是一个问题吗? Firebug 没有将我的任何 ajax 调用显示为已完成,即使返回了数据并执行了回调。递归结构似乎效率低下。有什么想法吗?

window.addEvent('domready', function()
{
    server =  new Request({
    url: "chat.php",
        method: 'get',
        link:   'ignore',
        onSuccess: callback,
    });

    request = server.send();
}

function callback(data)
{
    console.log(data);
    var data = JSON.decode(data);
    messId = data.max;
    for(var i = 0; i < data.messages.length; i++)
    {
        print("", data.messages[i].text);
    }
    var sendString = "messId="+messId;
    request = server.send(sendString);
}

【问题讨论】:

  • 一些 urs 代码可能有助于为您找到答案...
  • 如果你的 ajax 实现使用 iframe 来处理请求,那么你应该去 'net' 面板查看请求,它们不会显示在控制台面板中

标签: javascript ajax callback long-integer


【解决方案1】:

您是对的,当您以这种方式进行长轮询时,您必须毫无目的地维护堆栈和闭包,并且根据情况和实现,您可能会遇到堆栈溢出或至少内存不足...虽然我不确定各种 js 实现执行了哪些优化(例如,尾递归会使这些问题消失)。

简单的替代方法是使用window.setTimeout(funcName),它将在当前作用域解析时立即从全局作用域调用函数funcName

【讨论】:

  • 所以我替换了:request = server.send(sendString);与:window.setTimeout("recieve()");功能还没有完成。
  • 等等,既然是异步请求,回调函数应该完成了吧?
  • 是的,他们应该完成。除非请求超时......而不是完成?您至少可以尝试将最后一行更改为 window.setTimeout(function(){server.send(sendString)}); 尽管我认为这些调用不是递归的,但浏览器 HTTP 请求是异步的,就像您说的那样。
  • @Teddy 使用字符串作为 setTimeout 参数会导致对其进行评估,这可能会影响您的范围和性能。而是在其中放置一个实际的函数表达式,如丹尼尔在他的评论中所说的函数文字或匿名函数。其次,通过打开跟踪或放入一些日志 cmets(甚至是警报)来验证它(它应该)来测试你的回调是否被调用和完成。如果您在 Firebug 的 Net 面板中没有看到它,请尝试使用 Chrome 或 Safari 的调试器——Firebug 本身有一些奇怪的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 2021-09-26
  • 2016-05-10
  • 1970-01-01
  • 2020-10-07
  • 2012-02-24
  • 1970-01-01
相关资源
最近更新 更多