24

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

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

此外,我还尝试在服务器中配置一些缓存参数,以防万一。

唯一可行的方法是将 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");});});

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

4

2 回答 2

41

关闭

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

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

此外,被闭包捕获的变量只能被内部函数访问,而不能被产生闭包的更远的环境访问。例如,即使在没有语言关键字“Public”和“Private”的情况下,此功能也允许我们创建具有私有成员和公共成员的类类结构。

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

闭包对于良好、整洁的 javaScript 编程的重要性怎么强调都不过分。

在函数getData()形式下面的代码中,在每次调用时,一个闭包捕获id1id2(and 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');

});

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

于 2012-04-14T07:59:57.567 回答
-5

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

于 2012-04-14T01:13:18.857 回答