在闭包中访问ajax数据

时间:2013-03-28 22:49:50

标签: javascript jquery

我想在函数中填充一个“私有”变量,其中一些数据由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){

           };
      }
    });

})();

2 个答案:

答案 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)。因此,它将在周围的范围中查找(并设置)。只有当它没有被声明时,才会创建一个隐式的全局变量。