alertbox 팝업에 계속 정의되지 않고 있습니다. 뭔가 빠졌습니까? nodeArray[0]
에 대한 데이터가 있습니다. for 루프에 넣으면 올바르게 경고합니다.중첩 된 함수 사이에 배열을 전달하는 자바 스크립트
function other(){
oNodeArray = grabNodes(env, poolName);
}
alertbox 팝업에 계속 정의되지 않고 있습니다. 뭔가 빠졌습니까? nodeArray[0]
에 대한 데이터가 있습니다. for 루프에 넣으면 올바르게 경고합니다.중첩 된 함수 사이에 배열을 전달하는 자바 스크립트
function other(){
oNodeArray = grabNodes(env, poolName);
}
아약스 호출 비동기 같습니다
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`
});
와 아약스 콜백 당신이 전달하는 함수를 호출하고 여기에 배열을 전달할 수 있습니다
를function grabNodes(env, poolName, callback){
//....
ajaxRequest.onreadystatechange = function(){
// stuff
callback(nodeArray);
}
}
Ajax 호출은 비동기이기 때문에 코드 실행을 차단하지 않습니다. 일단 데이터가 수신되면 실행될 함수를 전달해야합니다.
또한 의견 :
var nodeArray = [];
배열을 초기화합니다.var env = "dev";
은 env
의 그림자입니다. 당신이 디폴트 값을 지정하려면,
env = env || 'dev';
AJAX 호출이 경고가 호출 될 때 아직 완료 가장 가능성이 없습니다 않습니다. 이것은 onreadystatechange 핸들러 안에 위치해야합니다.
그래서 나는 경고를 옮겼다. 그리고 나는 그것이 작동하고 있다는 것을 알기 위해 나에게 데이터를 준다. 그러나 나는 그 진술서를 이해하지 못하고있다. grabNodes()를 호출하는 다른 함수에있는 oNodeArray로 돌아 가야합니다. – Jim
@Jim : 콜백에 return 문을 넣을 필요가 없습니다. 아무런 효과가 없습니다. 내 업데이트 된 답변을 참조하십시오. –
grabNodes()가 이미 ajax 콜백에서 배열을 설정할 때까지 반환되었습니다. ajax 콜백에서 nodeArray 매개 변수로 주어진 함수를 호출 할 수 있도록 코드를 다시 형식화해야합니다. 당신은 동기식 방식으로 이것을 프로그램하려고하지만 Ajax는 정의상 동기식이 아닙니다. –