2012-04-14 59 views
24

我开发了一些网站,我总是碰到一个相同的问题:多个ajax电话。我有一个主页面,所有的内容都是异步加载的。加载页面时,有四个独立调用按页面(顶部,左侧,右侧和底部)“绘制”页面,并在加载时向用户显示典型的ajax旋转。所以,当浏览器收到请求时,我执行回调,不同的区域在不同的时间绘制。事实是,服务器的答案有时会混淆在一起,我的意思是,top的答案是左边的,反之亦然。同时发送多个ajax电话

我已经尝试了一些解决方案,比如在每个请求中创建一个时间戳,以向浏览器和服务器表明每个请求都不相同。

另外我试过在服务器上配置缓存的一些参数,以防万一。

在其中工程已包括在一个回调的请求2的唯一途径等

任何人都知道正确的方式去做或曾经击败这个问题?我不想做链接请求。

感谢

这里是我的意思的例子:

$(document).ready(function() { 

$.get('/activity',Common.genSafeId(),function(data){$('#stream').html(data);$("#load_activity").addClass("empty");}); 
$.get('/messages',Common.genSafeId(),function(data){$('#message').html(data);$("#load_messages").addClass("empty");}); 
$.get('/deals',Common.genSafeId(),function(data){$('#new_deals_container').html(data);$("#load_deal").addClass("empty");}); 
$.get('/tasks',Common.genSafeId(),function(data){$('#task_frames').html(data);$("#load_task").addClass("empty");});}); 

和HTML是一个简单的JSP有四个容器每一个具有不同的ID。

+3

你是什么意思,答案是在错误的地方画的?正确构造的Ajax调用将更新布局中非常特定位置的HTML的特定部分。发布一些简单的代码来说明问题。 – 2012-04-14 01:12:06

+0

你是否用$('#container')。append()来添加内容到你的页面? – jimw 2012-04-14 01:18:25

+0

是的,我更新了这篇文章。内容被添加到DOM,但有时候请求会将内容绘制在不合适的ID中。我知道这很奇怪,因此我通常会做链式要求。感谢您的答复。 – 2012-04-14 01:50:50

回答

-5

确保每个ajax调用都有不同的回调函数,这听起来像是你试图对所有四个函数使用相同的函数,因此当它们被乱序调用时(因为它们在服务器端需要不同的时间) ,他们正在渲染错误的地方。如果你坚持对所有的回调函数使用相同的函数,那么你必须在有效载荷中放入一些东西,以便回调知道要渲染到哪里。

+2

单独的函数不是解决这个问题的方法。在闭包中保留一个值很容易,以确定响应应该到哪里。 – 2012-04-14 01:25:56

+0

True Beetroot-Beetroot,但我敢打赌他没有使用jQuery。 – 2012-04-14 01:33:00

+3

谁说你需要jQuery来完成关闭? – 2012-04-14 01:34:52

39

封闭件

Closures有点令人兴奋的在第一。它们是javaScript和其他几种现代计算语言的一个特性。

闭包由具有内部函数(通常为匿名事件处理程序或命名方法)的函数的已执行实例形成,该函数需要访问一个或多个外部变量(即外部函数内的变量但在内部函数之外)。令人兴奋的事情是内部函数保留对外部变量的访问,即使外部函数已经完成并在内部函数执行时返回!

此外,由封闭捕获的变量可以访问只有内部功能,而不是进入封闭的进一步环境。例如,该功能可以让我们创建具有私人和公共成员的类似结构,即使在没有语言关键字“公共”和“私人”的情况下也是如此。

闭包是由内部函数使用外部变量抑制javaScript的“垃圾收集”,否则它会在完成后的某个不确定点破坏外部函数的环境。

封闭对良好,整洁的javaScript编程的重要性不可能过分。

在下面的功能getData()形式的代码,在每个呼叫,关闭捕捉id1id2(和url),它仍然可以匿名Ajax响应处理程序($不用彷徨的第三个参数)。

$(document).ready(function() { 

    function getData(url, id1, id2) { 
     $.get(url, Common.genSafeId(), function(data) { 
      $(id1).html(data); 
      $(id2).addClass("empty"); 
     }); 
    } 

    getData('/activity', '#stream', '#load_activity'); 
    getData('/messages', '#message', '#load_messages'); 
    getData('/deals', '#new_deals_container', '#load_deal'); 
    getData('/tasks', '#task_frames', '#load_task'); 

}); 

因此,而不是写四个独立的处理器,我们利用语言的形成封锁和调用相同功能,getData(),四次能力。在每个调用中,getData()形成一个新的闭包,它允许$ .get的响应处理程序(在服务器响应时异步调用)处理其的DOM元素。

+3

我从这个答案中学到了很多东西,但花了一段时间才弄清楚问题中原始代码有什么问题。是不是因为变量“data”实际上是每个调用的相同对象/实例,所以也被内部函数(闭包)重用?我猜我半期望JavaScript运行时会知道在这里创建4个独立的对象,因为它们在那个(有点奇怪的)范围内使用,并且从不在之前或之外。当然很高兴我不需要在与我合作的大多数其他语言中处理这种模糊的程度。 – eselk 2013-02-01 23:49:27

+0

@eselk,在9个月后再次审视这个问题,我不确定问题中的代码如何/为什么会混杂起来。我认为在我开始回答这个问题之后必须添加它,我想知道这是OP自己的解决方案,而不是描述了症状的代码。可以肯定的是,四个独立的函数,每个$ .get()都是不必要的。我的'getData()'函数简化了事情。一旦你把思想封闭起来,它们就非常简单 - 在实践中肯定比正式的定义更容易相信。 – 2013-02-02 02:18:05

+0

@ Beetroot-Beetroot我需要在页面加载时同时进行12个ajax调用。它似乎有一个响应被复制到另一个。这是由于浏览器并发呼叫数量的限制吗? – 2016-08-12 10:49:11