我在alertbox弹出窗口中不断定义...我是否缺少某些东西?并且有关于nodeArray[0]
的数据,因为如果我将它放在for循环中,它会正确提醒。在嵌套函数之间传递数组()
function other(){
oNodeArray = grabNodes(env, poolName);
}
我在alertbox弹出窗口中不断定义...我是否缺少某些东西?并且有关于nodeArray[0]
的数据,因为如果我将它放在for循环中,它会正确提醒。在嵌套函数之间传递数组()
function other(){
oNodeArray = grabNodes(env, poolName);
}
Ajax调用异步:
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;
}
函数的调用。 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';
Ajax调用是最有可能不是在调用警报尚未完成。这应该放在onreadystatechange处理程序中。
所以我提出了警报,它给我的数据,所以我知道它的工作。但是我不理解退货声明......如果我把它放在那里它返回到哪里?我需要它返回到另一个函数中的oNodeArray,它调用grabNodes() – Jim 2011-02-22 21:00:39
@Jim:你不需要在回调中放置一个return语句,它将不起作用。请看我更新的答案。 – 2011-02-22 21:02:51
当您在ajax回调中设置数组时,grabNodes()已经返回。您需要重新编写代码,以便您可以使用nodeArray作为ajax回调的参数调用给定的函数。你试图以同步的方式编程它,但是ajax在定义上并不是同步的。 – 2011-02-22 21:07:24