2012-05-11 3 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; 
} 

는 안팎으로 변수를 통과 할 어떻게 든 $ 갔지 문에서 함수의 매개 변수 (데이터)를 변경 내가 할 수 있습니까? 아니면 더 나은 방법이 있습니까?

+1

헤이 또 다른 "아약스가 보는 비동기 "질문 – jbabey

답변

1

정상적인 함수는 함수를 반환하고 종료합니다.

반면에 비동기식 아약스 요청을 수행하는 경우 요청이 완료되어 다시 전송 될 때까지 기다려야합니다.

따라서 함수가 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 요청은 비동기하지만 자바 스크립트가 계속 실행됩니다. 따라서 get 요청이 처리되기 전에 return result에 도달합니다.

2

ajax 호출이 완료되기 전에 함수가 반환됩니다. 즉, $.get의 콜백이 무엇인지, 그리고 이것이 비동기 인 이유입니다. 이 아약스 호출에서 결과를 얻으려면

, 당신은과 같이,이 호출의 콜백으로 논리의 나머지 부분을 묶을 필요가 :

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); 
         } 
        } 
       }); 
      } 
관련 문제