2012-02-08 14 views
0

我有以下的javascript代碼:如何使用jQuery AJAX數據進行可變

function initSite(){ 
    var site; 
    $.getJSON(www+'init/initSite', function(data) { site = data; }); 
} 
$(document).ready(function(){ 
    var site = initSite(); 
     console.log(site); 
} 

返回未定義 ...我怎麼可以存儲JSON對象,我在現場的變量,所以我能接受以後用它?

編輯: 這似乎工作,但林不知道,如果它的正確使用此解決方案

var site = null; 
$.ajax({ 
    url: www+"init/initSite", 
    async: false, 
    dataType: 'json', 
    success: function (data) { 
    site = data; 
    } 
}); 
console.log(site); 
+2

歡迎** **異步的精彩世界做這個任務!你不能那樣做。 – SLaks 2012-02-08 17:41:50

+0

那麼我應該如何使用isloggedin變量,我從javascript中的ajax查詢中獲取以限制用戶操作,如果他沒有登錄。 – fxuser 2012-02-08 17:43:25

+0

使用回調函數,如'getJSON'。 – SLaks 2012-02-08 17:47:43

回答

1
當然

你有不確定因爲你函數不會返回任何內容,並且ajax調用也是異步的,所以您必須等待服務器響應。由於$.ajax(和快捷方式)返回一個承諾,你可以使用延遲

function initSite(){ 
    return $.getJSON(www+'init/initSite'); 
} 
$(document).ready(function(){ 
    $.when(initSite()).done(function(data) { 
     /* continue here the code execution, e.g. call another function */ 

     doAllTheRemainingWorkWith(data) 

    }); 
} 

,你可以看到這個代碼是短,易於閱讀

+0

但我的代碼是太多了,把它放在那裏的功能......這是它應該如何工作? 'done()'裏面的 – fxuser 2012-02-08 17:50:21

+0

只是調用另一個傳遞返回數據的函數 – fcalderan 2012-02-08 17:51:14

1
function initSite(onSuccess){ 
    $.getJSON(www+'init/initSite', onSuccess); 
} 
$(document).ready(function(){ 
    initSite(function(data){ 
     var site = data; 
     // initialize your code. 
    }); 
} 
+0

我目前的javascript代碼超過2000行代碼...我必須把所有的代碼放在你調用函數的地方嗎? – fxuser 2012-02-08 17:48:05

1

的問題只是一個思念的概念:

getJSON是異步呼叫,並且site = data;只會在DOM準備好之後發生。

,以便爲您解決一切問題的方式應該,你的初始化需要從你的異步調用的結果開始,從未有過,例如:

// no need to wait for DOM ready to call `initSite` 
initSite(); 

function initSite() { 
    $.getJSON(www+'init/initSite', function(data) { 
     initialization(data); 
    }); 
} 
function initialization(site) { 
    // initialize all the things that need to be done 
    console.log(site); 
} 

$(document).ready(function(){ 
    // do other stuff, for example show a loading message/image 
}