0

休日が検出されたときに次の関数が true を返すのに問題があります。アラートは正しく発生しますが、結果は常に false を返します。これが可変スコープの問題であることは理解していますが、適切に修正する方法がわかりません。

function isHoliday(date,currentProvince) {
  var calDate = new Date(date);
  var result = false;
  $.get(
    "@Url.Content("~/Holidays/HolidayList/?province=")"+currentProvince, 
    function(data) {
      for (h=0; h<data.length; h++) {
        holidayDate = new Date(
          parseInt(data[h].date.replace("\/Date\(","").replace("\)\/",""))
        );
        if (holidayDate.getTime() == calDate.getTime()) {
          alert("HOLIDAY");
          result = true;
        }
      }
    }
  );

  return result;
}

$.get ステートメントで function(data) のパラメーターを何らかの方法で変更して、変数を出し入れすることはできますか? それとももっと良い方法がありますか?

4

3 に答える 3

2

この関数は、ajax 呼び出しが完了する前に戻ります。それが のコールバックの目的であり、これが非同期$.getである理由です。

この ajax 呼び出しから結果を取得したい場合は、次のように、残りのロジックをこの呼び出しからのコールバックになるように接続する必要があります。

function isHoliday(date,currentProvince, callback) {

                var calDate = new Date(date);
                $.get("@Url.Content("~/Holidays/HolidayList/?province=")"+currentProvince, function(data) {
                    for (h=0; h<data.length; h++) {
                        holidayDate= new Date(parseInt(data[h].date.replace("\/Date\(","").replace("\)\/","")));
                        if (holidayDate.getTime() == calDate.getTime()) {
                            alert("HOLIDAY");
                            callback(true);
                        }
                        else
                        {
                            callback(false);
                        }
                    }
                 });
             }
于 2012-05-11T15:29:16.723 に答える
1

通常の関数は関数を返し、終了します。

逆に、非同期 ajax リクエストを実行する場合、リクエストが完了して返送されるまで、必要なだけ任意に待機する必要があります。

したがって、関数が ajax 呼び出しを実行するときに、関数の戻り値に依存することはできません。

この問題を回避する適切な方法は、次のように関数にコールバックを記述することです。

function isHoliday(date,currentProvince, myCallback) {
    var calDate = new Date(date);
    var result = false;
    $.get("@Url.Content("~/Holidays/HolidayList/?province=")"+currentProvince, function(data) {

        myCallback();

    });
}

var callback = function() {
    for (h=0; h<data.length; h++) {
        holidayDate= new Date(parseInt(data[h].date.replace("\/Date\(","").replace("\)\/","")));
        if (holidayDate.getTime() == calDate.getTime()) {
            alert("HOLIDAY");
            result = true;
        }
    }
    //do whatever else you need to do after the ajax completes
};

isHoliday("12/01/19", "someProvince", callback);
于 2012-05-11T15:28:17.193 に答える
0

get リクエストは非同期ですが、JavaScript は引き続き実行されます。したがって、return resultget リクエストが処理される前に到達します。

于 2012-05-11T15:28:55.213 に答える