2011-05-09 85 views
7

我们都在AJAX教程中看到了一些发送数据的例子。他们都(或多或少)是这样的:什么是正确的方式来管理多个Ajax请求?

var http = createRequestObject(); // shared between printResult() and doAjax() 

function createRequestObject() { /* if FF/Safari/Chrome/IE ... */ ... } 

function printResult() 
{ 
    if (http.readyState == 4) { ... } 
} 

function doAjax() { 
    var request = 'SomeURL'; 
    http.open('post', request); 
    http.onreadystatechange = printResult; 
    data = ...; // fill in the data 
    http.send(data); 
} 

// trigger doAjax() from HTML code, by pressing some button 

下面是这种情况,我不完全理解:如果被按下按钮几次非常快?应该doAjax()以某种方式重新初始化http对象?如果该对象被重新初始化,那么正在进行的请求会发生什么?

PS:对主持人:这个问题可能与更多的社区维基。如此处所述(https://meta.stackexchange.com/questions/67581/community-wiki-checkbox-missing-in-action) - 如果我说得对 - 请正确标记此问题。

+1

+1这是一个常见问题的好问题 – 2011-05-09 08:04:32

回答

2

当然,现在有大量的图书馆能够完成体面的工作,应该在生产环境中使用。但是,我的问题是关于这些隐藏的细节。所以我在这里找到了lamda-calculus-like方法来为每个请求提供专用的请求对象。这些对象显然会传递给被调用时响应到达等回调函数:Chrome和IE9下试验成功

function printResult(http) { 
    if (http.readyState == 4) { ... } 
    ... 
} 

function doAjax() { 
    var http = createRequestObject();  
    var request = 'SomeURL'; 

    http.open('get', request);  
    http.onreadystatechange = function() { printResult(http); }; 
    http.send(null); 
    return false; 
} 

1

我用每页的请求队列来处理这种情况下(以抑制重复的请求并确保请求的顺序),但也有可能是一个更标准化的解决方案。

,因为这不是默认提供,您需要实现它在你的网页在JavaScript(或链接脚本)。单击一个按钮就可以将请求添加到队列中,而不是启动Ajax请求。如果队列为空,则执行Ajax请求,并使用回调删除排队条目并执行下一个(如果有)。

参见:How to implement an ajax request queue using jQuery

+0

我也使用每个页面的请求,我?但它如何解决/抑制重复的请求? – BreakPhreak 2011-05-09 08:13:18

3

由于AJAX有asynchronus性质,与每个按钮点击要提高,将GET/POST一些数据FROM/TO服务器异步事件。您提供一个回调函数,因此在服务器完成数据处理时会多次触发它。

,缺省为正常行为,你不应该重新初始化HTTP对象。如果您想要显示多个发送操作,则必须手动执行该操作(例如,首次调用时禁用按钮)。

我也建议使用jQuery $就因为它incapsulate许多这些细节。

+0

调用XMLHTTPRequest对象的打开函数将中止发送算法并取消该对象负责的任何网络活动。仅仅因为它是异步的并不意味着一个对象可以同时处理多个请求,事实上它不能。 – 2011-05-09 08:31:41

相关问题