我有完整的代码:
$.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未确定
任何人都知道为什么?提前谢谢。
答案 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;
});
};