2010-04-01 58 views
2

我試圖從一個函數返回ajax成功數組到另一個函數。出於某種原因,我似乎無法將存儲在ajax函數成功部分的變量中的數據傳遞給父函數以返回。jquery post成功變量範圍

我看了這個帖子,試圖理出頭緒,但不是這樣的運氣: jQuery Ajax call - Set variable value on success

感謝這麼多的任何援助。

下面的代碼的簡化版本:

// make json_to_return global 
var json_to_return; 

function loop_through_data(){ 

    // call the load_days function and put its array data into days_array 
    var days_data = load_days(03,2010); 

    // I'd like to be able to iterate through days_data here 
    // 
    // 
} 

function load_days(selectedMonth, selectedYear){ 
        $.ajax({ 
        type: "POST", 
        dataType: "json", 
        url: "../includes/get_availability.php", 
        data: "month=" + selectedMonth + "&year=" + selectedYear, 
        success: function(available_json){ 
         json_to_return = available_json; 
        }, 
        error: function(msg){ 
        alert("error " + msg); 
        } 
       }); 
       return json_to_return; 

} 

回答

6

你的這部分功能後發生的情況:

success: function(available_json){ 
        json_to_return = available_json; 
       } 

所以你返回變量未定義,因爲代碼來設置它直到響應從服務器返回纔會發生。要麼調用代碼的其餘部分從成功函數運行,以便在數據準備就緒時運行,或者設置async:false(因鎖定瀏覽器而不太理想)。

async: false方法是這樣的:

   $.ajax({ 
       type: "POST", 
       async: false, 
       dataType: "json", 
       url: "../includes/get_availability.php", 
       data: "month=" + selectedMonth + "&year=" + selectedYear, 
       success: function(available_json){ 
        json_to_return = available_json; 
       }, 
       error: function(msg){ 
       alert("error " + msg); 
       } 
      }); 

更好的方法:

   $.ajax({ 
       type: "POST", 
       dataType: "json", 
       url: "../includes/get_availability.php", 
       data: "month=" + selectedMonth + "&year=" + selectedYear, 
       success: function(available_json){ 
        loopThroughTheDaysAndDoStuff(available_json); 
       }, 
       error: function(msg){ 
       alert("error " + msg); 
       } 
      }); 
+0

謝謝,我沒有意識到回報在崗位完成前解僱。現在一切都說得通了。 我會重新調整事情,以便它們在成功時發生: 我曾經希望將它作爲一個實用工具,我可以從多個函數中調用,但是現在可以使用。 – salonMonsters 2010-04-01 21:41:14

2

$.ajax是一個異步函數。

這意味着當被調用時,函數會繼續執行。

在您的代碼提供var days_data = load_days(03,2010);發生這種情況:

  • 啓動Ajax調用(異步,功能不斷執行)
  • 回報json_to_return(不確定)
  • days_data ==未定義
  • Ajax調用完成,json_to_return被分配(這可以在任何時間段發生)

您應該重新考慮自己的邏輯,並且圍繞ajax調用的異步性開始編碼。

第一種方法可能是將函數(回調函數)傳遞給load_days,應該在調用ajax成功後調用該函數。

+0

「保留我的新四月的傻瓜化身」按鈕在哪裏? – 2010-04-01 21:40:18

+0

另一個有趣的方法 - 謝謝 – salonMonsters 2010-04-01 21:44:06