0

我有这段代码,它工作得很好:

$.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 未定义

有谁知道为什么?提前致谢。

4

2 回答 2

4

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

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

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

于 2013-03-19T23:31:57.757 回答
3

因为 AJAX 是“异步的”。您有您的 AJAX 成功处理程序 return 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;
    });
};
于 2013-03-19T23:31:39.513 回答