如何从一个函数内部获取变量(在Ajax调用中使用)
问题描述:
问候我有一个Ajax调用其中:如何从一个函数内部获取变量(在Ajax调用中使用)
- 获取职位的xml文件
- 填充后信息的二维数组(文字和链接)
我接下来需要的是让数组完成下一步操作,但我无法完成。
范围问题? 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);
};
签出来。 1秒。 – sleeper
我现在看到它。很酷。谢谢!将对此问题进行更多的研究。 – sleeper