在闭包中访问ajax数据



我想用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一起)。因此,它将在周围的范围中查找(并设置)。只有在没有声明全局变量的情况下,才会创建一个隐式全局变量。

最新更新