如何从一个函数内部获取变量(在Ajax调用中使用)

如何从一个函数内部获取变量(在Ajax调用中使用)

问题描述:

问候我有一个Ajax调用其中:如何从一个函数内部获取变量(在Ajax调用中使用)

  1. 获取职位的xml文件
  2. 填充后信息的二维数组(文字和链接)

我接下来需要的是让数组完成下一步操作,但我无法完成。

范围问题? Ajax问题?

请指教。

// create the link 
var posts_href = 'get-posts.php'; 

// Create XHR Object 
function getHTTPObject(){ 
    var xhr = false; 
    // test if standards based 
    if (window.XMLHttpRequest) { 
     xhr = new XMLHttpRequest(); 
    } 
    else if (window.ActiveXObject) { 
     try{ 
      xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
     } catch(e) { 
      try { 
       xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
      } catch(e){ 
       xhr = false; 
      } 
     } 
    } 
    return xhr; 
} 

// Grab File ASYCHRONOUSLY 
function grabFile(file){ 
    // create a new instance of the xhr object 
    var request = getHTTPObject(); 

    // if successful, initiate ajax request 
    if(request){ 
     request.onreadystatechange = function(){ 
      parseResponseXML(request); 

     }; 

     request.open("GET",file,true); 
     request.send(null); 
     return true; 
    } else { 
     return false; 
    } 
} 

// make the ajax call 
grabFile(posts_href); 

// create the responseXML function 
function parseResponseXML(req){ 
    if(req.readyState == 4){ 
     if(req.status == 200 || req.status == 304){ 
      var textArray = []; 
      var posts = req.responseXML.getElementsByTagName('post'); 

      // create array to hold the posts (strings)  
      textArray = new Array(posts.length); 

      for(var i=0;i<posts.length;i++){ 

       var post_text, text, post_link, details_link; 

       // get the post info 
       post_text = posts[i].getElementsByTagName('text'); 
       text = post_text[0].firstChild.nodeValue 

       post_link = posts[i].getElementsByTagName('details_link'); 
       if(post_link[0].firstChild != null){ 
        details_link = post_link[0].firstChild.nodeValue; 
       } else { 
        details_link = ""; 
       } 

       // add post to textArray 
       textArray[i] = new Array(text, details_link); 
       // console.log(textArray[i]); 

      } // end for..loop     
     }  // end if(req.status) 
    }   // end if(req.readyState) 
}    // end parseResponseXML() 


// get the value of textArray from the function ->THIS FAILS 
console.log(textArray); 

是的,这是一个阿贾克斯问题。 Ajax是异步的。无论在回调中需要执行哪个“下一步”,取决于textArray您可以修改parseResponseXML接收,它应该在结果数组传递给一个任意回调:

function parseResponseXML(req, callback) { 
    // same as original implementation above 
    // then, 
    callback(textArray); 
} 

然后你使用它是这样的:

function doAfterParse(textArray) { 
    console.log(textArray); 
} 

// snip... 
request.onreadystatechange = function(){ 
    parseResponseXML(request, doAfterParse); 
}; 
+0

签出来。 1秒。 – sleeper

+0

我现在看到它。很酷。谢谢!将对此问题进行更多的研究。 – sleeper