我正在設置一個網頁,通過來自嵌入式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. 如何在不包含重疊的情況下對重疊間隔進行求和
- 4. 如何在彼此不重疊的情況下傳播divs
- 5. 如何在不重疊的情況下切換片段?
- 6. 如何在不重疊的情況下產生多個節點?
- 7. 在不使用GWT窗口部件的情況下進行ajax調用
- 8. 重疊情況
- 9. 如何在不重建的情況下調試應用程序
- 10. 如何在不調用super.onCreate的情況下重寫onCreate方法
- 11. AMP:如何在不使用style =「width」的情況下在CSS中進行調查?
- 12. 如何在不使用提交的情況下進行POST?
- 13. 如何在不使用GROUP BY的情況下進行聚合?
- 14. 如何在不使用更新的情況下進行轉換
- 15. CodeIgniter Active Record:在不運行SQL的情況下進行調試
- 16. 如何在不進入AJAX的情況下對一行html輸入字段進行重新排序
- 17. 如何在沒有pdb文件的情況下進行調試?
- 18. 如何在沒有Visual Studio的情況下進行調試?
- 19. 如何在不使用cookie的情況下使用Wordpress Ajax調用進行身份驗證的用戶?
- 20. 如何在不影響每一行的情況下進行foreach?
- 21. 如何在沒有「link_to」類助手的情況下調用ajax?
- 22. 如何在沒有AJAX的情況下調用上一頁
- 23. 如何在不使GUI無響應的情況下進行Web服務調用
- 24. 如何在不衝突的情況下運行AJAX請求?
- 25. 需要額外提供數據:如何在不進行AJAX調用的情況下執行此操作?
- 26. 如何在不進行完整服務器往返的情況下在jsf頁面中調用ajax?
- 27. 在沒有頁面刷新的情況下對Strut2動作進行Ajax調用
- 28. 如何在不更改URL欄的情況下在.htaccess中進行重定向
- 29. 如何在不依賴xcode4的情況下進行清理
- 30. 如何在不進行輪詢的情況下實現std :: when_any?
歡迎來到StackOverflow。偉大的第一個問題 – Sampson 2009-12-18 22:18:53