2013-10-16 81 views
0

我在尋找一些幫助,下面...JavaScript函數回調之前完成完成

我有一個費用的形式,其中用戶可以輸入自己的里程要求及任何其他費用發生。例如,如果您在0-9英里之間旅行,您將獲得5英鎊的固定費用,10-19英里獲得7英鎊,20-20英鎊9等等的里程率。

我有一個小計div我想更新每當里程值改變,但我的函數計算小計似乎被執行之前的AJAX調用,以獲得定價樂隊完成。

小計功能基本上是:

function calculateClaim() { 
    var mileageDistance = document.getElementById('journeyMileage').value; 
    var expenseAmount1 = document.getElementById('expenseAmount1').value; 
    var expenseAmount2 = document.getElementById('expenseAmount2').value; 
    var expenseAmount3 = document.getElementById('expenseAmount3').value; 
    if (mileageDistance != "") { 
     calculateMileage = calculateMileageTotal(mileageDistance, function() { 
      var mileageTotal = this; 
      if (mileageTotal == '') { 
       $("#mileageTotal").val(0.00); 
       $("#journeyAmount").html('<strong>&pound;0.00</strong>'); 
       showDialog('alert','OK','','There is no mileage payment set up.',''); 
      } else { 
       mileageTotal = parseFloat(mileageTotal).toFixed(2); 
       $("#mileageTotal").val(mileageTotal); 
       $("#journeyAmount").html('<strong>&pound;' + mileageTotal + '</strong>'); 
      } 
     }); 
    } else { 
     mileageTotal = 0; 
     mileageTotal = mileageTotal.toFixed(2); 
     document.getElementById('journeyAmount').innerHTML = '<strong>&pound;</strong>'; 
    } 
    /* 
     SOME VALIDATION STUFF HERE FOR OTHER EXPENSE FIELDS 
    */ 
    subTotalCost = parseFloat(mileageTotal) + parseFloat(expenseAmount1) + parseFloat(expenseAmount2) + parseFloat(expenseAmount3); 
    subTotalCost = subTotalCost.toFixed(2); 
    document.getElementById('subTotal').innerHTML = '<strong>&pound;' + subTotalCost + '</strong>'; 
} 

這就是所謂的calculateMileageTotal功能如下:

function calculateMileageTotal(mileage,callback) { 
    var mileageDistance = mileage; 
    var mileageTariffExists = $('#mileageTariffExists').val(); 
    if (mileageTariffExists == 1) { 
     $.ajax({ 
      type: "POST", 
      url: "./ajaxQueries.cfc?method=getExpensesMileageBand", 
      data: ({ 
      competitionID: $("#compID").val(),   
      matchDate: $("#matchDate").val(), 
      mileageTotal: mileageDistance 
      }), 
      dataType: "xml", 
      success: function(xml) { 
       $(xml).find('field').each(function(){ 
        //alert((new XMLSerializer()).serializeToString(xml)); 
        var mileageTotal = $(this).find('string').text(); 
        callback.call(mileageTotal); 
       }); 
      } 
     }); 
    } else { 
     showDialog('alert','OK','','There is no Mileage Rate available.',''); 
    } 
} 

的getExpensesMileageBand功能肯定是工作,因爲它應該和返回里程率,但它是總計算認爲里程累計值是空的,因爲它還沒有從函數返回,但是如果我在其中放置了一些警報,它會起作用(因爲它會減慢函數的速度)。

任何人有任何想法?我沒有用之前的回調,所以我不知道這是我要去哪裏錯了嗎?

回答

0

爲什麼不把小計計算作爲一個單獨的函數,從回調結束或else語句的結尾調用。

function calculateSubtotal(milageTotal) { 
    subTotalCost = parseFloat(mileageTotal) + parseFloat(expenseAmount1) + parseFloat(expenseAmount2) + parseFloat(expenseAmount3); 
    subTotalCost = subTotalCost.toFixed(2); 
    document.getElementById('subTotal').innerHTML = '<strong>&pound;' + subTotalCost + '</strong>'; 
} 

if (mileageDistance != "") { 
    calculateMileage = calculateMileageTotal(mileageDistance, function() { 
    var mileageTotal = this; 
    if (mileageTotal == '') { 
     // existing code 
    } else { 
     // existing code 
     calculateSubtotal(milageTotal); 
    } 
    }); 
} else { 
    // existing code 
    calculateSubtotal(milageTotal); 
} 
+0

咄!謝謝你的幫助 – CPB07

相關問題