2013-05-20 64 views
0

我有以下代碼,可在需要時提前一個月加載有關用戶付款的信息。當我等待每個月加載時,該函數可以工作,但是當多個Ajax請求正在運行時,它會失敗。基本上重複的數據被添加到我的monthData數組,這意味着loadedPaymentMonth被覆蓋每個函數調用。我想異步加載數據,所以有什麼想法?使用異步AJAX(使用jQuery)請求加載數據時覆蓋的變量

這不起作用:

var monthData=[]; 
function loadMonth(monthToLoad,curMonth){ 
    $("#paymentContent").find(".loader").remove(); 
    var monthToGet; 
    switch(monthToLoad){ 
     case "Next": monthToGet=monthData.length-curMonth+1; 
     break; 
     case "Prev": monthToGet=-curMonth-1; 
     break; 
     case "This": monthToGet=currentMonthPointer-curMonth; 
     break; 
    } 
    var loadedPaymentMonth=new PaymentMonth(); 
    if(monthToGet<0){ 
     currentMonthPointer+=1; 
     monthData.unshift(loadedPaymentMonth); 
    } 
    else{ 
     monthData.push(loadedPaymentMonth); 
    } 
    $.getJSON(host+"GetDataForMonth.aspx?StartMonth="+monthToGet,function(data){ 
     loadedPaymentMonth.setMonthData(data.monthData,data.month,data.year); 
     if($("#paymentsContent").find(".loader").remove().length>0){ 
      loadedPaymentMonth.createPaymentRowsForMonth(); 
     } 
    }).error(function(){ 
     $("#paymentsContent").find(".loader").remove(); 
    }); 
} 

這並不:

function loadMonth(monthToLoad,curMonth){ 
    $("#paymentContent").find(".loader").remove(); 
    var monthToGet; 
    switch(monthToLoad){ 
     case "Next": monthToGet=monthData.length-curMonth+1; 
     break; 
     case "Prev": monthToGet=-curMonth-1; 
     break; 
     case "This": monthToGet=currentMonthPointer-curMonth; 
     break; 
    } 
    var loadedPaymentMonth=new PaymentMonth(); 
    if(monthToGet<0){ 
     currentMonthPointer+=1; 
     monthData.unshift(loadedPaymentMonth); 
    } 
    else{ 
     monthData.push(loadedPaymentMonth); 
    } 
    $.ajax({ 
     url:host+"GetDataForMonth.aspx?StartMonth="+monthToGet, 
     async:false, 
     dataType:"json", 
     success:function(data){ 
     loadedPaymentMonth.setMonthData(data.monthData,data.month,data.year); 
     if($("#paymentsContent").find(".loader").remove().length>0){ 
      loadedPaymentMonth.createPaymentRowsForMonth(); 
     } 
     } 
    }).error(function(){ 
     $("#paymentsContent").find(".loader").remove(); 
    }); 
} 
+0

VAR loadedPaymentMonth =新PaymentMonth();創建一個新的PaymentMonth對象並將其插入到數組中。每個函數調用都應該創建一個新的paymentmonth對象。因此,雖然變量名稱可能相同,但引用應該是特定於其創建的函數上下文的。 –

回答

0

所以我有這樣的檢查,看看是否一個月就裝好,如果沒有,它加載後的代碼。但是,我沒有處理這個案例。由於paymentmonth是在AJAX啓動之前添加的,因此我需要用新的Paymon月份替換舊的付款月份對象(如果新請求在舊的請求之前完成,則只使用舊的付款月對象也會導致同步問題)。所以這個:

if(monthToGet<0){ 
    currentMonthPointer+=1; 
    monthData.unshift(loadedPaymentMonth); 
} 
else{ 
    monthData.push(loadedPaymentMonth); 
} 

成爲本:

var loadedPaymentMonth=new PaymentMonth(); 
if(monthToLoad!="This"){ 
    if(monthToGet<0){ 
     currentMonthPointer+=1; 
     monthData.unshift(loadedPaymentMonth); 
    } 
    else{ 
     monthData.push(loadedPaymentMonth); 
    } 
} 
else{ 
    monthData[currentMonthPointer]=loadedPaymentMonth; 
}