2012-05-11 108 views
0

我在檢測到假期時無法使以下函數返回true。警報正確啓動,但結果始終返回false。我知道這是一個可變範圍的問題,但我不確定如何正確修復它。如何從子函數(JavaScript)中更改函數的返回值

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語句中的函數(數據)的參數以將變量傳入和傳出嗎?還是有一種方式?

+1

嗨,你看另一個「阿賈克斯異步「問題 – jbabey

回答

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); 
+0

克里斯蒂安是正確的。你需要返回所謂的承諾。以下是關於如何在jQuery中使用它們(和延遲)的[視頻教程](http://tutsplus.com/lesson/deferreds/)。 – JellicleCat

+0

感謝您的信任投票! – Kristian

0

的GET請求是異步的JavaScript,但繼續執行。因此,在獲取請求處理之前它達到return result

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); 
         } 
        } 
       }); 
      }