如何使数据覆盖结果变量?
var ajax = {
get : {
venues : function(search){
var results = "@";
$.getJSON("http://x.com/some.php?term="+search+"&callback=?",function(data){ results = data; });
return results;
}
}
};
答案 0 :(得分:6)
data
返回后, results
覆盖results
。
您可以使用ajax
功能代替getJSON
,因为getJSON
只是
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
然后还将async
设置为false
,以便通话阻止。
但是,在您的情况下这不起作用,因为JSONP请求("?callback=?"
)不能同步。
另一个(更好)选项是让任何代码依赖于results
回调调用的success
返回值。
所以,而不是像这样:
var results = ajax.get.venues('search');
$('#results').html(translateResults(results));
也许是这样的:
ajax.get.venues('search', function (results) {
$('#results').html(translateResults(results));
});
venues = function (search, callback) {
$.getJSON("http://x.com/some.php?term="+search+"&callback=?",
function(data){
callback(data);
});
};
答案 1 :(得分:5)
您的问题是JavaScript的异步特性。 results
会被覆盖,但只能在函数退出后才被覆盖,因为请求完成后会执行回调。
您必须使用sync: true
使Ajax调用同步(这通常不是一个好主意,只是为了完整性而提及它)或重构您的代码流,因此它不依赖于{{1不再有价值,但你需要做的一切都是在回调函数中完成的。
答案 2 :(得分:3)
这不是范围问题。这是因为$.getJSON
是异步的;在results
完成之前返回$.getJSON
。尝试为$.getJSON
进行回调,以便在完成后调用。
function JSON_handler(data){
// do stuff...
}
$.getJSON("http://x.com/some.php?term="+search+"&callback=?", JSON_handler);
答案 3 :(得分:3)
您可以将要运行的逻辑放在回调中。
var ajax = {
get : {
venues : function(search, fnCallback){
var results = "@";
$.getJSON("http://x.com/some.php?term="+search+"&callback=?",
function(data){
// success
results = data;
(typeof fnCallback == 'function') && fnCallback(data);
});
return results;
}
}
};
ajax.get.venues(term, function(result){
// Do stuff with data here :)
})
函数式编程很有趣。