多个ajax同时调用

kra*_*oss 24 ajax jquery

我开发了一些网站,我总是偶然发现一个问题:多个ajax调用.我有一个主页面,其中所有内容都异步加载.加载页面时,有四个INDEPENDENT调用按区域(顶部,左侧,右侧和底部)"绘制"页面,当它加载时,我向用户显示典型的ajax旋转.因此,当浏览器收到请求时,我执行回调,并且不同的区域在不同的时间绘制.事实上,服务器的答案有时会混淆,我的意思是,top的答案是左边的,反之亦然.

我尝试了一些解决方案,比如在每个请求中创建一个时间戳,以向浏览器和服务器指示每个请求是不同的.

另外,我试图在服务器中配置一些缓存参数,以防万一.

工作的唯一方法是在一个回调中包含request2等.

任何人都知道正确的方法,或曾经打败过这个问题?我不想做链式请求.

谢谢

这是我的意思的一个例子:

$(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");});});
Run Code Online (Sandbox Code Playgroud)

而html是一个简单的jsp,每个容器有四个容器,每个容器都有不同的id.

Bee*_*oot 39

封闭件

封闭起初有点令人兴奋.它们是javaScript和其他几种现代计算语言的一个特性.

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

此外,闭包捕获的变量只能由内部函数访问,而不能进入使闭包进入的更远的环境.例如,即使在没有语言关键字"公共"和"私人"的情况下,此功能也允许我们使用私有成员和公共成员创建类似于类的结构.

闭包是通过内部函数使用外部变量来抑制javaScript的"垃圾收集"而实现的,否则它会在完成后的某个不确定点处破坏外部函数的环境.

闭包对良好,整洁的javaScript编程的重要性不能过分强调.

在函数getData()形式下面的代码中,在每次调用时,闭包陷阱id1id2(和url)仍然可用于匿名ajax响应处理程序($ .get的第三个参数).

$(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');

});
Run Code Online (Sandbox Code Playgroud)

因此,我们利用语言形成闭包并调用相同函数的能力,而不是编写四个单独的处理程序,而不是getData()四次.在每次调用时,getData()形成一个新的闭包,它允许$ .get的响应处理程序(在服务器响应时异步调用)来解决 DOM元素.

  • 我从这个答案中学到了很多,但是花了一些时间来弄清楚问题中原始代码的错误.是因为变量"data"实际上是每个调用的相同对象/实例,所以内部函数(闭包)也会重用它们?我想我有一半期望JavaScript运行时会知道在这里创建4个单独的对象,因为它们用于那个(有些奇怪的)范围,而且从来没有在那之前或之外.当然,我很高兴我不需要处理与我合作的大多数其他语言中的那种黑暗程度. (3认同)

Rob*_*phy -5

确保每个 ajax 调用都有不同的回调,听起来您正在尝试对所有四个调用使用相同的函数,因此当它们被无序调用时(因为它们在服务器端花费不同的时间),它们正在渲染在错误的地方。如果您坚持对所有回调使用相同的函数,那么您必须在有效负载中放置一些内容,以便回调知道要渲染到哪里。

  • 谁说你需要 jQuery 来完成闭包? (3认同)
  • 单独的功能并不是解决这个问题的方法。在闭包中保存一个值来确定响应应该去哪里是非常简单的。 (2认同)