我想在函数中填充一个“私有”变量,其中一些数据由ajax加载,因此可以在函数中访问它。我目前有什么:
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){
};
}
});
})();
答案 0 :(得分:0)
请记住,因为ajax是异步的,所以你不能依赖于ajax请求何时完成(甚至完全完成),因此触发了ajax回调。所以这绝不可能依赖于:
var ajaxData;
$.ajax().done(function (data) { ajaxData = data; });
useAjaxData(ajaxData);
也就是说,依赖于ajax数据的代码的 所有 必须在ajax回调中完成。
关于是否可以使更漂亮的具体问题,这确实是一个意见问题,但不是使用success:
,您可能更喜欢使用延迟方法。
var jqxhr = $.ajax();
/* millions of lines of code */
jqxhr.done(function (data) {
// work with the ajax data
});
答案 1 :(得分:-1)
将数据变量放在顶部闭包中:
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
)。因此,它将在周围的范围中查找(并设置)。只有当它没有被声明时,才会创建一个隐式的全局变量。