2013-03-28 72 views
0

我想在我的函數中填充一個「private」變量,其中某些數據由ajax加載,因此可以在函數中訪問它。我目前有:在關閉中訪問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

請記住,因爲ajax是異步的,所以不能依賴於ajax請求何時完成(甚至完成)以及何時觸發ajax回調。因此,這絕不可能依靠:

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

也就是說是所有你的代碼依賴於阿賈克斯的數據已在AJAX回調做。

至於你提到是否可以製成漂亮具體問題,這確實是見仁見智,但不是使用success:你可能更願意使用遞延方法。

var jqxhr = $.ajax(); 
/* millions of lines of code */ 
jqxhr.done(function (data) { 
    // work with the ajax data 
}); 
-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)。因此它將在周圍的範圍內查找(並設置)。只有在完全沒有聲明的情況下,纔會創建一個隱式的全局變量。