1

我正在开发一个大量使用 AJAX 功能的应用程序。我目前正在处理一个页面,其中有大量的 ajax 调用来呈现初始页面。所有这些调用都通过同一个 AJAX 脚本进行路由,因此它们必须由浏览器一次调用。(是的,这有点低效)

我有一个加载另一个页面的事件,但不幸的是它需要进行 ajax 调用才能重新呈现页面。这样做的结果是,如果用户在页面第一次加载时点击了该链接,浏览器会等待所有其他 ajax 调用,然后再根据用户点击引发的事件重新渲染页面。这导致在页面加载时单击指向页面的链接时页面的加载时间明显变慢。

我的问题是:有没有办法使用 Javascript 或其他方法让 Web 浏览器取消对 Web 脚本的 http 调用,以便另一个事件可以调用同一个脚本?我知道每次调用不同的脚本会很好,这样它们就可以同时发生,但不幸的是,我正在处理的应用程序通过一个中央脚本汇集所有 ajax 请求,而且这不会很快改变。

4

2 回答 2

2

使用 XMLHttpRequest 对象上的abort()方法来取消任何正在进行的请求并将对象返回到可重用状态。

您可以将它包装在一个辅助对象中,例如:

function HttpQueue(uri) {
    var queue= [];
    var xhr= new XMLHttpRequest();
    xhr.onreadystatechange= function() {
        if (xhr.readyState===4 && queue.length>=1) {
            queue.unshift()[1](xhr);
            if (queue.length>=1)
                next();
        }
    };
    this.send= function (data, callback, isurgent) {
        if (isurgent && queue.length>=1) {
            queue.length= 0;
            xhr.abort();
        }
        queue.push([data, callback]);
        if (queue.length==1)
            next();
    };
    function next() {
        xhr.open('POST', uri, true);
        xhr.send(queue[0][0]);
    }
}

var queue= new HttpQueue('/script');

queue.send('action=foo', function() {
    alert('task 1 done');
}, false);

queue.send('action=bar', function() {
    alert('task 2 done');
}, false);

queue.send('action=bof', function() {
    alert('task 3 is urgent! tasks 1 and 2 can get knotted');
}, true);

(未经测试,可能有效)

于 2012-06-26T20:17:31.150 回答
0

您可以使用 jQuery $.ajax 方法。

此时,您将为每个调用指定超时,然后将 aSync 设置设置为 false。这样你一次只能运行一个 ajax 请求。

文档可以在这里找到:http: //api.jquery.com/jQuery.ajax/

于 2012-06-26T19:13:50.153 回答