0

我想用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){

           };
      }
    });

})();
4

2 回答 2

0

请记住,因为 ajax 是异步的,所以您不能依赖 ajax 请求何时完成(甚至根本不完成),因此也不能依赖于触发 ajax 回调的时间。所以这永远不能依赖:

var ajaxData;
$.ajax().done(function (data) { ajaxData = data; });
useAjaxData(ajaxData);

也就是说,你所有依赖于ajax数据的代码都必须在ajax回调中完成。

至于您关于是否可以使其更漂亮的具体问题,这确实是一个见仁见智的问题,但success:您可能更喜欢使用 Deferred 方法而不是使用。

var jqxhr = $.ajax();
/* millions of lines of code */
jqxhr.done(function (data) {
    // work with the ajax data
});
于 2013-03-28T23:03:49.397 回答
-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在成功处理程序的范围内声明(使用 )。因此它将在周围的范围内查找(并设置)。只有根本没有声明它,才会创建一个隐式全局变量。

于 2013-03-28T23:00:07.103 回答