-1

I've been watching for a while the questions here in Stack Overflow about returning arrays on JavaScript, but not a single answer works in my code. It always returns 'undefined'.

This is the important part of the code:

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 tried defining the variable datos as a new Array() and new Object(). Also I'm trying returning an Object (like {"arreglo" : [1,2,3,4]}), defining a new Array() and new Object() within obtenerDatos(id) function, changing between syncronic and asyncronic, etc ...

But every time it returns 'undefined' :c

So, How can I definitely return an Array from a function?

Thanks in advanced! :)

4

3 回答 3

0

你得到未定义的原因是因为你正在调用obtenerDatos()然后调用

xmlhttp.send(null);

xmlhttp.send(null);<-- 是一个异步调用。所以你obtenerDatos()的函数在那之后立即返回。并且由于您没有为 obtenerDatos 返回任何内容的 return 语句,因此该变量datos将不会像现在一样得到任何东西或未定义。

于 2013-10-16T19:35:43.727 回答
0

obtenerDatos()没有return。其上下文中唯一的“返回”是在另一个动态声明的函数中onreadystatechange,但该函数不算在内。它是一个延迟事件,将在 AJAX 请求结束时的其他时间运行。obtenerDatos()本身没有返回任何东西。

您需要做的是设置一个回调函数,一旦 AJAX 完成获取数据,该回调函数将与 AJAX 响应一起调用以处理它。

这个另一个问题可能会更好地解释它。

于 2013-10-16T19:31:03.927 回答
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
    });
}
于 2013-10-16T19:48:54.917 回答