0

以下の点についてアドバイスをお願いしたいのですが...

ユーザーがマイレージ請求とその他の費用を入力できる費用フォームがあります。走行距離のレートは決まっているので、たとえば、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 関数は確実に正常に機能し、マイレージ レートを返しますが、関数からまだ返されていないため、mileageTotal 値が空であると考えるのは小計計算ですが、いくつかのアラートを入力すると機能します (機能が遅くなります)。

誰でもアイデアはありますか?以前にコールバックを使用したことがないので、それが間違っているのかどうかわかりませんか?

4

1 に答える 1

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);
}
于 2013-10-16T09:44:18.683 に答える