1

我在 JavaScript 中有以下方法:

function getData(){
    var result;

    $.getJSON("app/data/ptl", function (data) {
        if (data == null) {
            return false;
        }

        var x_data = new Array();
        var y_data = new Array();

        $.each(data, function(index, value) {
            x_data.push(index);
            y_data.push(value);
        });

        result = [months_data,value_data];

    });

    alert('');
    return result;
}

调用此方法时,将检索确切的数据。但是,当我删除alert('')数据时没有收到。有谁知道这个问题的合理解释?

4

3 回答 3

6

那是因为您的函数是异步的,并且删除该行会在远程服务器应答之前执行alert该行。return r

您不能简单地从调用异步工作的函数同步返回。通常的解决方案是提供一个回调并在回调中执行你想要做的事情:

function fetchData(doWithData){
  $.getJSON("app/data/ptl", function (data) {
    if (data == null) {
        return;
    }
    var x_data = new Array();
    var y_data = new Array();
    $.each(data, function(index, value) {
        x_data.push(index);
        y_data.push(value);
    });
    r = [months_data,value_data];
    doWithData(r);
   });
}


fetchData(function(result) {
   // use result here
});
于 2013-03-06T15:34:07.043 回答
4

alert()return r;您的 ajax 调用的“成功”处理程序之外。请记住 AJAX 调用是异步的。警报迫使浏览器等待您确认警报,这通常允许 AJAX 调用完成并填充您的r变量。没有警报,.getJSON()立即返回,BEFOREr被填充。

于 2013-03-06T15:34:34.247 回答
1

$.getJSON()调用建立了一个异步进程。该函数本身(几乎)立即返回,但您传入的回调函数将在稍后执行,当浏览器实际收到您正在联系的服务器的响应时。因此,从这样的回调中返回一个值本质上是没有意义的,因为没有人可以或不会关注它。

相反,您应该做任何需要访问回调函数中检索到的信息的工作。

于 2013-03-06T15:34:50.237 回答