我在警告框弹出窗口中一直未定义...我错过了什么吗?并且nodeArray[0]
上有数据,因为如果我把它放在for循环中,它会正确地发出警报。
function grabNodes(env, poolName){
var env = "dev";
var nodeArray = new Array();
var ajaxRequest; //initialize ajax object
var browser = navigator.appName; //find the browser name
if(browser == "Microsoft Internet Explorer"){
/* Create the object using MSIE's method */
ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
else{
/* Create the object using other browser's method */
ajaxRequest = new XMLHttpRequest();
}
// Create a function that will receive data sent from the server
ajaxRequest.onreadystatechange = function(){
if(ajaxRequest.readyState == 4){
// Get the data from the server's response
//what on this page is changing
var xmlRes=ajaxRequest.responseXML.documentElement;
try {
for(var i=0; i<xmlRes.getElementsByTagName('node').length;i++){
nodeArray[i] = xmlRes.getElementsByTagName('node')[i].firstChild.nodeValue;
}//end for loop
}
catch (err){
}
alert(nodeArray[0]);
}
}
//return nodeArray;
}
函数由:
调用function other(){
oNodeArray = grabNodes(env, poolName);
}
答案 0 :(得分:3)
Ajax调用是异步。 alert(nodeArray[0]);
在您分配给ajaxRequest.onreadystatechange
的功能之前执行。
将alert
放入回调中它将起作用(前提是您获得了有效的回复)。 必须从回调中调用必须对结果进行操作的每个代码。
更新:您无法返回数据。您必须重新构建代码才能使用回调。
如果您当前的代码是
oNodeArray = grabNodes(env, poolName);
// work on `oNodearray`
您必须将其更改为:
grabNodes(env, poolName, function(oNodearray) {
// work on `oNodearray`
});
并且Ajax回调必须调用您传递的函数并将数组传递给它:
function grabNodes(env, poolName, callback){
//....
ajaxRequest.onreadystatechange = function(){
// stuff
callback(nodeArray);
}
}
因为Ajax调用是异步的,所以它们不会阻止代码的执行。您需要传递一个在收到数据后将执行的函数。
进一步评论:
var nodeArray = [];
初始化数组。 var env = "dev";
会影响参数env
。如果要指定默认值,请执行
env = env || 'dev';
答案 1 :(得分:0)
调用警报时,ajax调用很可能尚未完成。这应该放在onreadystatechange处理程序中。