我正在设置一个网页,通过来自嵌入式Web服务器的AJAX调用对数据进行采样。我将如何设置代码以便一个请求不会与另一个请求重叠? 我应该提到我有很少的JavaScript体验,也是一个令人信服的理由,不使用任何大小可能大于10千字节的外部库。如何在不重叠的情况下进行Ajax调用?
回答
AJAX尽管名称不必是异步的。
这里是异步方法...
var req;
function ajax(method,url,payload,action)
{
if (window.XMLHttpRequest)
{
req = new XMLHttpRequest();
req.onreadystatechange = action;
req.open(method, url, true);
req.send(payload);
}
else if (window.ActiveXObject)
{
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req)
{
req.onreadystatechange = action;
req.open(method, url, true);
req.send(payload);
}
else
{
alert("Could not create ActiveXObject(Microsoft.XMLHTTP)");
}
}
}
...但这里是一个同步相当于...
function sjax(method,url,payload,action)
{
if (window.XMLHttpRequest)
{
req = new XMLHttpRequest();
req.open(method, url, false);
req.send(payload);
action();
}
else if (window.ActiveXObject)
{
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req)
{
req.onreadystatechange = action;
req.open(method, url, false);
req.send(payload);
}
else
{
alert("Could not create ActiveXObject(Microsoft.XMLHTTP)");
}
}
}
...这里是一个典型的动作...
function insertHtml(target)
{
var pageTarget = arguments[0];
if (req.readyState == 4) // 4 == "loaded"
{
if (req.status == 200) // 200 == "Ok"
{
if (req.responseText.indexOf("error") >= 0)
{
alert("Please report the following error...");
pretty = req.responseText.substring(req.responseText.indexOf("error"),1200);
pretty = pretty.substring(0,pretty.indexOf("\""));
alert(pretty + "\n\n" + req.responseText.substring(0,1200));
}
else
{
div = document.getElementById(pageTarget);
div.innerHTML = req.responseText;
dimOff();
}
}
else
{
alert("Could not retreive URL:\n" + req.statusText);
}
}
}
同步请求并不是最好的主意,在我看来,它们锁定了页面的其余部分......但这取决于用户的要求。另外,从jQuery $ .ajax文档:“最好是在需要同步时用其他方式阻止用户交互。” – 2009-12-19 04:21:42
我建议你使用一个小工具包,如jx.js(source)。你可以在这里找到它:http://www.openjs.com/scripts/jx/(小于1K精缩)
要设置一个请求:
jx.load('somepage.php', function(data){
alert(data); // Do what you want with the 'data' variable.
});
要设置它在某个区间,你可以使用setInterval
和变量来存储是否请求目前存在的 - 如果是这样,我们简单做什么:
var activeRequest = false;
setInterval(function(){
if (!activeRequest) {
// Only runs if no request is currently occuring:
jx.load('somepage.php', function(data){
activeRequest = false;
alert(data); // Do what you want with the 'data' variable.
});
}
activeRequest = true;
}, 5000); // Every five seconds
与其他答案一样......那么为什么要浪费时间间隔,而只是进行同步呼叫。您通过投票平均浪费5000ms/2。 – dacracot 2009-12-18 22:45:39
你可能要考虑从以前的AJAX调用成功的响应后,ONLY然后重新打开AJAX请求的选项。
function autoUpdate()
{
var ajaxConnection = new Ext.data.Connection();
ajaxConnection.request(
{
method: 'GET',
url: '/web-service/',
success: function(response)
{
// Add your logic here for a successful AJAX response.
// ...
// ...
// Relaunch the autoUpdate() function in 5 seconds.
setTimeout(autoUpdate, 5000);
}
}
}
本例使用ExtJS,但你可以很容易地只使用XMLHttpRequest
。
注:如果你必须有X秒一个确切的时间间隔,你必须追踪从当AJAX请求发起到setTimeout()
调用中传递的时间,然后减去从这个时间跨度延时。否则,上述示例中的间隔时间将随网络延迟和处理Web服务逻辑的时间而变化。
不完全是他们要求的,但一个非常好的解决方案(只使用回调) – 2009-12-19 04:22:50
好的答案。但是,在先前的Ajax调用完成后,您可能希望设置“setTimeout”,而不管它是否成功。否则,第一次出现超时或错误时,您将停止获取更新。 – Grodriguez 2011-09-10 08:52:57
- 1. 如何在没有jQuery的情况下进行AJAX调用?
- 2. 如何在不包含重叠的情况下对重叠间隔进行求和
- 3. 在不使用GWT窗口部件的情况下进行ajax调用
- 4. AMP:如何在不使用style =“width”的情况下在CSS中进行调查?
- 5. CodeIgniter Active Record:在不运行SQL的情况下进行调试
- 6. 如何在不使用GROUP BY的情况下进行聚合?
- 7. 如何在不使用提交的情况下进行POST?
- 8. 如何在不进入AJAX的情况下对一行html输入字段进行重新排序
- 9. 如何在没有pdb文件的情况下进行调试?
- 10. 如何在没有Visual Studio的情况下进行调试?
- 11. 如何在不影响每一行的情况下进行foreach?
- 12. 如何在没有AJAX的情况下调用上一页
- 13. 如何在不更改URL栏的情况下在.htaccess中进行重定向
- 14. 如何在不锁定的情况下对文件进行href?
- 15. 如何在不依赖xcode4的情况下进行清理
- 16. 如何在不进行轮询的情况下实现std :: when_any?
- 17. 如何在不改变变量的情况下进行递归
- 18. 在不使用HTML的情况下在JTextPane中进行换行
- 19. 如何在没有淡化文字的情况下进行图像叠加?
- 20. onBeforeUnload - 如何在不使用ajax的情况下调用服务器端函数
- 21. 如何在不重复的情况下重用大型查询?
- 22. 如何在不重定向的情况下执行href
- 23. 如何在不关闭的情况下重新运行cloud-init?
- 24. 在现有AJAX调用出错的情况下进行另一个Jquery AJAX调用
- 25. 在没有调试器的情况下进行调试
- 26. 如何在不使用回调的情况下在ajax调用之后执行点击处理程序
- 27. 如何在不重新加载页面的情况下提交Zend_Form - 使用Ajax?
- 28. 如何在不重叠的情况下并排显示几个kendo图表
- 29. 如何在不引起像素重叠的情况下缩小块
- 30. 如何在使用SQL Server的情况下进行分组?
欢迎来到StackOverflow。伟大的第一个问题 – Sampson 2009-12-18 22:18:53