1

我正在尝试这样做,它返回“未定义”:

$.ajax({
    url : 'curriculum/read_types',
    type : 'GET',
    dataType : 'JSON',
    success : function(data) {
        return data;
    }
})

但如果我这样做:

$.ajax({
    url : 'curriculum/read_types',
    type : 'GET',
    dataType : 'JSON',
    success : function(data) {
        console.log(data);
    }
})

它在控制台上写入一个完整的 JSON 对象,所以我知道存在数据。

我怎样才能返回这些数据?


我想做的是下一个:

var curriculum = {
add : function() {
    html = [];

    html.push('<select name="type" required>');
    html.push('<option value="0">Grupo general...</option>');

    var types = curriculum.read_types();
    $.each(types, function(k,v) {
        html.push('<option value="'+v+'">'+v+'</option>')
    })

    html.push('</select>');

    content.show('Añadir imagen a curriculum',html.join(''));
},
read_types : function() {
    $.getJSON('curriculum/read_types', function(data) {
        return data;
    })
}
}

curriculun.add()

最后它管理但有一个 asyn:false 请求:

var curriculum = {
add : function() {
    html = [];
    html.push('<select name="type" required>');
    html.push('<option value="0">Grupo general...</option>');

    var types = curriculum.read_types();
    $.each(types, function(k,v) {
        html.push('<option value="'+v+'">'+v+'</option>')
    })


    html.push('</select>')
    content.show('Añadir imagen a curriculum',html.join(''));
},
read_types : function() {
    var a;
    $.ajax({
        url : 'curriculum/read_types',
        type : 'GET',
        async : false,
        contentType : 'JSON',
        success : function(data) {
            a = data;
        }
    })
    return a;
}
}
4

3 回答 3

5

回调函数(如成功处理程序)是注册的异步事件,一旦 AJAX 请求完成就会触发并将成功的结果返回给客户端浏览器。由于该事件已注册,因此它不会阻止您的 AJAX 请求所在的函数运行。

为了处理数据,只需将数据交给另一个函数,如下所示:

$.ajax({
    url : 'curriculum/read_types',
    type : 'GET',
    dataType : 'JSON',
    success : function(data) {
        console.log(data):

        // process the results
        processData(data);
    }
});


function processData(data) {
    // do stuff with the data here
}

更新:

read_types : function() {
    $.getJSON('curriculum/read_types', function(data) {
        return data;
    });
}

上面的代码只是你不能做的事情。以下是对流程的粗略描述:

  • read_types函数是从其他进程调用的。

  • $.getJSON 函数使用 2 个参数调用:路径和回调处理程序。

  • read_types 函数完成处理并到达末尾。

  • 接下来,当 read_types 方法完成时,getJSON 函数向您的 URL 发出 HTTP GET 请求。
  • 数据在响应中接收并作为分配给参数“data”的参数传递给回调处理程序。
  • 当您调用时,return data;您将数据返回到匿名成功回调函数,而不是 read_types。因此,return 语句基本上什么都不做。

同步请求示例:

现在,话虽如此,您可以向服务器发出同步请求,但强烈建议不要这样做,因为它会对视图产生影响。

但是,这是一个示例,仅用于学术目的。除非你真的很清楚自己在做什么,否则我永远不会提倡使用这种策略:

注意:除非您知道自己在做什么,否则不要在生产中使用它!

function getData() {

    var myDataObj = null;

    // this will BLOCK execution of all other scripts on the page until
     // the data is received!
    $.ajax({
        url : 'curriculum/read_types',
        type : 'GET',
        dataType : 'JSON',
        success : function(data) {
            console.log(data):

            // we can assign this data to myDataObj in synchronous requests
            myDataObj = data;

        },
        async: false  /** Make a synchronous request **/
    });

    // Since we BLOCKED, this object is not null. If we used async: true 
     // (the default) then this would return null.
    return myDataObj;
}
于 2012-05-12T23:13:36.503 回答
4

如前所述,ajax 是异步的。您可以传递 async false 以强制 javascript 线程等待,但这很讨厌并且非常不像 javascript。我解释说你想要的是这样的:

var myData;
$.ajax({
    url : 'curriculum/read_types',
    type : 'GET',
    async : false,
    dataType : 'JSON',
    success : function(data) {
        myData = data;
    }
})

// while this is what you want to do, myData would be undefined here
console.log(myData);

但相反,您应该继续做您在成功功能中所做的事情。

于 2012-05-12T23:13:28.563 回答
1

Ajax 是异步的,因此返回它并没有什么好处。您可以改用自定义事件。在成功函数中:

$('#someelement').trigger('read_types_loaded', [data]);

然后在某处附加一个事件监听器:

$('#someelement').bind('read_types_loaded', function(event,data){
    // Do something with data
});
于 2012-05-12T23:20:17.440 回答