此代码仅在async设置为false时有效,为什么?
var contact =
{
XMLHttp : null,
XMLDoc : null,
TXTDoc : null,
getData : function(dataSource)
{
contact.XMLHttp = new XMLHttpRequest();
contact.XMLHttp.open("GET", dataSource, false);
contact.XMLHttp.onreadystatechange = contact.storeData;
contact.XMLHttp.send(null);
},
storeData : function()
{
if(contact.XMLHttp.readyState == 4 && contact.XMLHttp.status == 200)
{
contact.XMLDoc = contact.XMLHttp.responseXML;
contact.TXTDoc = contact.XMLHttp.responseText;
}
},
displayData : function(elementID)
{
if(contact.TXTDoc != null)
document.getElementById(elementID).innerHTML = contact.TXTDoc;
else{
document.getElementById(elementID).innerHTML = "can't do it";
}
}
}
我将它导入到html文档中,如下所示:
<head>
<script type="text/javascript" src="contact.js"></script>
</head>
并像这样使用它:
<body id="para">
<script type="text/javascript">
contact.getData("http://localhost/~olatunjigbadamosi/Books/contact.txt");
contact.storeData();
contact.displayData("para");
</script>
答案 0 :(得分:3)
因为它是异步的,所以将HTTP请求发送到文本文件需要时间,因此回调contact.storeData
被称为AFTER contact.displayData
。
解决方案是简单地在storeData中调用它,因此它在向文本文件发出HTTP请求并填充txtDoc属性后触发。
storeData : function()
{
if(contact.XMLHttp.readyState == 4 && contact.XMLHttp.status == 200)
{
contact.XMLDoc = contact.XMLHttp.responseXML;
contact.TXTDoc = contact.XMLHttp.responseText;
contact.displayData("para");
}
},
适用于我的完整代码:
<p id="para"></p>
<button id="foo">go</button>
<script>
var contact =
{
XMLHttp : null,
XMLDoc : null,
TXTDoc : null,
getData : function(dataSource)
{
contact.XMLHttp = new XMLHttpRequest();
contact.XMLHttp.open("GET", dataSource, true);
contact.XMLHttp.onreadystatechange = contact.storeData;
contact.XMLHttp.send(null);
},
storeData : function()
{
if(contact.XMLHttp.readyState == 4 && contact.XMLHttp.status == 200)
{
contact.XMLDoc = contact.XMLHttp.responseXML;
contact.TXTDoc = contact.XMLHttp.responseText;
contact.displayData("para");
}
},
displayData : function(elementID)
{
if(contact.TXTDoc != null)
document.getElementById(elementID).innerHTML = contact.TXTDoc;
else{
document.getElementById(elementID).innerHTML = "can't do it";
}
}
},
button = document.getElementById('foo');
button.onclick = function() {
contact.getData("http://localhost/file.txt");
contact.storeData();
};
</script>
答案 1 :(得分:1)
同步执行此操作时:
contact.getData("http://localhost/~olatunjigbadamosi/Books/contact.txt");
contact.storeData();
contact.displayData("para");
调用 getData
,发送请求并返回,getData在完成后返回,然后storeData和displayData运行。
当你执行异步时,getData启动请求并立即返回。然后在准备好之前调用storeData和displayData,因此它们不起作用。请求的结果尚未返回。
就像meder说的那样,要修复它,你需要在回调函数中进行显示。这确保了在运行displayData时可以获得请求的结果。