2013-10-16 3 views
-1

잠깐 동안 JavaScript에서 배열을 반환하는 방법에 대한 질문은 Stack Overflow에서 보았습니다. 단 하나의 대답은 내 코드에서 작동하지 않습니다. 항상 '정의되지 않음'을 반환합니다.(JavaScript) 배열을 반환 할 수 없습니다.

이 코드의 중요한 부분은 다음과 같습니다

function VisualizadorIzquierdo() { 
    // some stuff here 
    this.dibujar = function() { 
     var datos = obtenerDatos(0); 
     alert(datos);       //<--- This always returns 'undefined' 
     // other stuff here 
    } 
    // more stuff here 
} 

function obtenerDatos(id) {                    
    var xmlhttp = ConstructorXMLHttpRequest(); 
    if(!xmlhttp) alert('Error: No se pudo crear el objeto XMLHttpRequest'); 
    else { 
     xmlhttp.onreadystatechange = function() { 
      if(xmlhttp.readyState == 4) 
      { 
       alert(xmlhttp.responseText); //<--- This returns '[1,2,3,4]'  
       return xmlhttp.responseText; 
      } 
     } 
     xmlhttp.open('GET', rutaLector + '?archivo=' + archivos[id], false); 
     xmlhttp.send(null);  
    } 
} 

I'v이 새 Array()새 개체()로 변수 datos을 정의했습니다. 또한 내가 개체를 반환하려고 해요 (같은 은 { "arreglo"[1,2,3,4]})하는 새로운 배열을 정의()새 개체()내 obtenerDatos (ID) 기능 등, syncronic 및 asyncronic 사이에 변화 ...

그러나 반환 때마다 '정의되지 않은'

그래서

c를, 어떻게 확실히 함수에서 배열을 반환 할 수 있습니다?

고맙습니다. :)

+2

_asynchronous_ 호출에서 반환 된 데이터가 유효하다고 가정하면 코드가 반환되기 전에 경고가 실행되므로 정의되지 않은 것입니다. – j08691

+0

@ j08691 알림을 삭제해도 작동하지 않습니다. ( – Warren

답변

0

obtenerDatos()에는 return이 없습니다. 그 문맥에서 유일한 '반환'은 동적으로 onreadystatechange으로 선언되는 다른 함수 안에 있지만 그 수는 포함되지 않습니다. 지연된 이벤트는 AJAX 요청이 체결 된 다른 시간에 실행됩니다. obtenerDatos() 그 자체가 아무것도 반환하지 않습니다.

당신이해야 할 일은 AJAX가 데이터를 가져 오는 작업을 마치면 AJAX 응답으로 호출되어 콜백 함수를 처리하는 콜백 함수를 설정하는 것입니다.

This other question 더 잘 설명 할 수 있습니다. 비동기 호출 - 당신은 다음

xmlhttp.send(null); 

xmlhttp.send(null); < 호출하는 obtenerDatos()를 호출하기 때문에

+0

* asyncronic * param을 * false *로 설정하면 * var datos = obtenerDatos (0); * 선언이 앞으로 이동합니까? – Warren

+0

It 'onreadystatechange'는 아무데도 반환하지 않는다는 사실을 변경하지 않습니다. – Havenard

0

당신이 정의되지지고 이유입니다. 그래서 당신은 obtenerDatos() 함수를 즉시 반환합니다. obtenerDatos에 대한 리턴 문이 없으므로 변수 datos은 현재 수행 중이므로 아무 것도 얻지 않거나 정의되지 않습니다.

+0

비동기 호출이 끝날 때까지 기다려서 * nothing *을 반환하지 않으려면 어떻게해야합니까? 가능)? – Warren

+0

열려있는 함수에서 이러한 매개 변수를 허용합니다. void open (DOMString 메서드, DOMString url, 선택적 부울 async, 선택적 DOMString 사용자, 선택적 DOMString 암호), async? thats 어디에. 여기에 문서 링크 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest?redirectlocale=en-US&redirectslug=DOM%2FXMLHttpRequest – Sucaritas

0

jQuery에서 시도해보십시오.

function VisualizadorIzquierdo() { 
    // some stuff here 
    obtenerDatos(0).done(function (result) { 
     //var datos = obtenerDatos(0); 
     alert(result);       
     // other stuff here 
    }); 
    // more stuff here 
} 


function obtenerDatos(id) { 

    return $.ajax({ 
     url: rutaLector + '?archivo=' + archivos[id], 
     type: "GET", 
     success: function (result) { }, 
     error: function() { }, 
     traditional: true 
    }); 
} 
관련 문제