2011-09-26 30 views
0

我試圖從其中包含ajax調用的函數獲取json值。從具有ajax調用的函數中獲取json值

這是我的函數:

function getVariables(){ 

    $.ajax({ 
     type: "post", 
     url: "db/functions.php", 
     data: "func=getvars, 
     dataType: "json", 
     success: function(response) 
     {   
     return { 
      'var1': response.var1, 
      'var2': response.var2 
     }; 
     } 
    });  
} 

我試圖用這個在我的JavaScript獲得VAR1 VAR firstvar = getVariables()VAR1。

當我在getVariables函數中設置警報時,它返回的是var1和var2,已經檢查過了。所以唯一不能正常工作的部分是:var firstvar = getVariables()。var1;

回答

0

有兩個問題:

Ajax調用,默認情況下是異步的。這意味着直到getVariables返回後纔會調用成功函數。你需要改變你的ajax調用的設置,使它是同步的。

你的第二個問題是,這些值是從成功函數返回的,但不會從getVariables函數返回它們。您需要從函數作用域返回變量。

下面是相同的功能,但async選項設置爲false,並從函數的作用域返回值。

function getVariables(){ 
    var rv = undefined; 
    $.ajax({ 
     async : false, 
     type: "post", 
     url: "db/functions.php", 
     data: "func=getvars", 
     dataType: "json", 
     success: function(response) 
     {   
     rv = { 
      'var1': response.var1, 
      'var2': response.var2 
     }; 
     } 
    });  
    return rv; 
} 
+0

我收到錯誤; getVariables()未定義 – nouky

+0

@nouky - 這很可能是一個語法錯誤:錯誤的功能或有不匹配的括號。無法幫助您 - 嘗試在IE9中使用F12開發人員工具運行它,看看它是否可以幫助您。 –

+0

好的謝謝安德魯 – nouky

0

您的匿名成功函數返回var1var2(無門),但getVariables沒有返回他們。它實際上不能,因爲它在異步JSON調用完成之前退出。即使它是同步的,你仍然沒有返回匿名「子函數」的返回值。

編輯:你可以做這樣的事情:

function getVariables(){ 

    var response = $.ajax({ 
     type: "post", 
     url: "db/functions.php", 
     data: "func=getvars, 
     dataType: "json", 
     async: false 
    }); 
    return {'var1': response.var1, 
      'var2': response.var2} 
} 

見return語句現在是如何在getVariables,而不是在INSIDE getVariables的功能?所以現在getVariables將返回值。

雖然要小心使用async:false,但它可以鎖定瀏覽器。

+0

如果我添加:async:false 它不會幫助? – nouky

+0

如果你還*移動return語句,它應該工作。看到我上面的編輯。 – Dave

+0

我得到未定義的變量..我想我需要發佈整個代碼,以便您可以更好地瞭解發生了什麼事情。 – nouky

0

這不起作用。 AJAX調用是異步的,需要等待http請求完成才能使用它的返回值。

您可以使AJAX調用同步,但這可能會引入不必要的延遲。通常,更好的選擇是直接在回調「成功」函數中使用變量。

+0

我想返回的值,以便我可以在不同的情況下使用它們,例如一次作爲文本其他時間作爲輸入值等等 – nouky

+0

雖然我認爲你可以通過使ajax調用同步工作,那麼你每次調用getVariables()時都會發出http請求。您可以將數據返回的數據推送到更易於訪問的範圍中,但是如果沒有您的目標更完整的概念,則很難提供代碼。 – Colin

+0

我將在網上發佈我的整個代碼,以便您可以更好地瞭解該場景 – nouky

相關問題