getJSON在函数中不起作用,它返回一个值

时间:2013-03-19 23:27:56

标签: javascript jquery json

我有完整的代码:

$.getJSON('/admin/get_acronyms', function(data) {
    //load JSON
    $.each(data, function(key, val) {
        if(key === 'error') {
            alert(val);
        } else {
            //Update typeahead source
            autocomplete.data('typeahead').source = val;
        }
    });
});

我想在此函数中最小化它以重用代码:

var getAndAppendJSON = function(url) {
    var result;
    $.getJSON(url, function(data) {
        $.each(data, function(key, val) {
            return val;
        });
    });
};


var arr = getAndAppendJSON('/admin/get_acronyms');
autocomplete.data('typeahead').source = arr;

但是这个功能不起作用:(。

JS控制台向我显示var arr未确定

任何人都知道为什么?提前谢谢。

2 个答案:

答案 0 :(得分:4)

getAndAppendJSON实际上并没有返回任何内容。它启动一个AJAX调用,在调用完成后完成。你应该做的是使用回调中返回的数据:

var getAndAppendJSON = function(url) {
    var result;
    $.getJSON(url, function(data) {
        autocomplete.data('typeahead').source = data;
    });
};

您的请求将花费一些时间来访问服务器并返回。这是处理程序的用途,一旦在不确定的时间段内返回给您,就能够处理数据。

答案 1 :(得分:3)

因为AJAX是“异步”的。您的AJAX成功处理程序返回val,但是您要返回哪里?

执行时

var arr = getAndAppendJSON('/admin/get_acronyms');

AJAX调用已发送到服务器,但该函数没有返回任何内容。因此arr未定义。当AJAX调用从服务器返回时,JS的其余部分已经很久了。

要做你想要实现的目标,分配必须在回调函数中进行:

var getAndAppendJSON = function(url) {
    var result;
    $.getJSON(url, function(data) {
        autocomplete.data('typeahead').source = data;
    });
};