我想用ajax加载的一些数据在函数中填充一个"private"变量,这样就可以在函数中访问它。我现在拥有的:
var foo = (function(){
var ajaxData;
var useAjaxData = function(data){
};
})();
我想我需要做一些类似的事情,因为它是一个异步调用?有没有更好的解决办法?
var foo = (function(){
$.ajax({
url: 'something',
success: function(data){
var ajaxData = data;
var useAjaxData = function(data){
};
}
});
})();
请记住,因为ajax是异步的,所以您不能依赖于ajax请求何时完成(甚至根本无法完成),因此也不能依赖于ajax回调何时被触发。所以这永远不能依赖:
var ajaxData;
$.ajax().done(function (data) { ajaxData = data; });
useAjaxData(ajaxData);
也就是说,所有依赖于ajax数据的代码必须在ajax回调中完成。
至于你的具体问题,是否可以使更漂亮,这确实是一个意见问题,但你可能更愿意使用Deferred方法而不是使用success:
。
var jqxhr = $.ajax();
/* millions of lines of code */
jqxhr.done(function (data) {
// work with the ajax data
});
把data变量放到top闭包中:
var foo = (function() {
var ajaxData; // accessible in the anonymous function and any nested function
function useAjaxData() {
// `ajaxData` is accessible from here,
// but will be undefined until the server response has been handled
doSomethingWith(ajaxData);
}
$.ajax({
// ...
success: function(data) {
// note: no `var` here, the outer `ajaxData` variable will be used
ajaxData = data;
}
});
}());
这是有效的,因为ajaxData
变量没有在成功处理程序的作用域中声明(与var
一起)。因此,它将在周围的范围中查找(并设置)。只有在没有声明全局变量的情况下,才会创建一个隐式全局变量。