2012-12-14 91 views
0

在$(document).ready中,我在ajax請求中創建了一個函數,該函數返回添加到數組中的json數據。我從該函數返回數組,但是當我嘗試分配什麼返回給另一個數組時,我的警報不顯示數組中充滿了值。Javascript分配函數返回數組到另一個數組與所有元素

function retrieveGroupNames() { 
     var rows = new Array(); 
     $.ajax({ 
      type: "POST", 
      url: '@Url.Action("LookUpGroupName", "UserManager")', 
      dataType: "json", 
      data: {}, 
      success: function (data) { 
       for (var i = 0; i < data.length; i++) { 
        rows[i] = { 
         data: data[i], 
         value: data[i].group, 
         result: data[i].group 
        } 
//     alert(data[i].group); 
        //     alert(data[1].group); 
       } // end of for loop 
       //    alert(rows[1].value); 


      } // end of success 
     }); // end of ajax 
//  alert(rows); data here 
     return rows; 

    } // end of function 

$(document).ready(function() { 
     chkSelection(); 
     var rows = []; 
     rows = retrieveGroupNames(); 
     alert(rows); 
    }); 

請幫忙嗎?謝謝!

回答

3

AJAX是異步的。你不能退還依賴於請求完成的東西。你需要使用一個回調來代替:

function retrieveGroupNames(callback) { 
    $.ajax({ 
     type: "POST", 
     url: '@Url.Action("LookUpGroupName", "UserManager")', 
     dataType: "json", 
     data: {}, 
     success: function(data) { 
      var rows = []; 
      for(var i = 0; i < data.length; i++) { 
       rows[i] = { 
        data: data[i], 
        value: data[i].group, 
        result: data[i].group 
       } 
      } 
      callback(rows); 
     } 
    }); 
} 

$(document).ready(function() { 
    chkSelection(); 
    retrieveGroupNames(function(rows) { 
     alert(rows); 
    }); 
}); 
+0

很高興看到作爲參數傳遞給函數並在ajax之後執行的回調函數。我之前很掙扎,現在有了一個想法。謝謝 –

1

比ThiefMaster的回答提供的回調以外的另一種選擇是使用$.Deferred objects。使用deferreds可以控制異步處理期間何時發生的事情,如ajax調用。

function retrieveGroupNames() { 
    // create a deferred object 
    var deferred = new $.Deferred(); 

    $.ajax({ 
     ... 
     success: function(data) { 
      var rows = []; 
      for(var i = 0; i < data.length; i++) { 
       rows[i] = { 
        data: data[i], 
        value: data[i].group, 
        result: data[i].group 
       } 
      } 
      // resolve the deferred and pass the rows as data 
      deferred.resolve(rows); 
     } 
    }); 

    // return a promise 
    return deferred.promise(); 
} 

$(document).ready(function() { 
    // use the when...then syntax to consume the deferred function 
    $.when(retrieveGroupNames()).then(function (rows) { 
     // do whatever you want with rows 
    }); 
}); 

還要注意的是$.ajax已經返回一個承諾本身,所以你可以只說return $.ajax({...});retrieveGroupNames功能。

+0

確實,這也是一個不錯的主意。我真的想過在添加它的時候考慮這個問題,但後來認爲我太懶了:P - 無論如何,你不需要'$ .when()' - 只需'retrieveGroupNames()。then(..)'也應該做這項工作。 – ThiefMaster

相關問題