2014-07-18 3 views
0

searchXML이라는 분리 된 함수에서 일부 매개 변수가 전달되고 매개 변수를 기반으로 특정 값을 반환하고 해당 값을 개체에 저장하도록 XML 파일을 구문 분석합니다. 그런 다음 다른 함수에서 searchXML()을 호출하고 결과를 객체에 저장합니다. 불행히도, 그 객체는 비어있는 것으로 나타났습니다. 나는 상대적으로 자바 스크립트에 익숙하지 않기 때문에 오류를 일으키는 내 논리 또는 구문인지 확실하지 않습니다.Javascript - 함수의 결과를 객체에 저장하려고합니다. 개체가 null입니다.

XML은이 형식에 :

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
<Row> 
    <Tab>MF_Act</Tab> 
    <Category>Product Store Sessions </Category> 
    <_2013_01_31>1</_2013_01_31> 
    <_2013_02_28>2</_2013_02_28> 
    <_2013_03_31>3</_2013_03_31> 
    <_2013_04_30>4</_2013_04_30> 
    <_2013_05_31>5</_2013_05_31> 
    <_2013_06_30>6</_2013_06_30> 
    <_2013_07_31>7</_2013_07_31> 
    <_2013_08_31>8</_2013_08_31> 
    <_2013_09_30>9</_2013_09_30> 
    <_2013_10_31>10</_2013_10_31> 
    <_2013_11_30>11</_2013_11_30> 
    <_2013_12_31>12</_2013_12_31> 
    <FY_2013>x</FY_2013> 
    <_2014_01_31>1</_2014_01_31> 
    <_2014_02_28>2</_2014_02_28> 
    <_2014_03_31>3</_2014_03_31> 
    <_2014_04_30>4</_2014_04_30> 
    <_2014_05_31>5</_2014_05_31> 
    <_2014_06_30>6</_2014_06_30> 
    <_2014_07_31>7</_2014_07_31> 
    <_2014_08_31>8</_2014_08_31> 
    <_2014_09_30>9</_2014_09_30> 
    <_2014_10_31>10</_2014_10_31> 
    <_2014_11_30>11</_2014_11_30> 
    <_2014_12_31>12</_2014_12_31> 
    <FY_2014>y</FY_2014> 
</Row> 
<Row> 
    <Tab>MF_Act</Tab> 
    <Category>YTD</Category> 
    <_2013_01_31>1</_2013_01_31> 
    <_2013_02_28>2</_2013_02_28> 
    <_2013_03_31>3</_2013_03_31> 
    <_2013_04_30>4</_2013_04_30> 
    <_2013_05_31>5</_2013_05_31> 
    <_2013_06_30>6</_2013_06_30> 
    <_2013_07_31>7</_2013_07_31> 
    <_2013_08_31>8</_2013_08_31> 
    <_2013_09_30>9</_2013_09_30> 
    <_2013_10_31>10</_2013_10_31> 
    <_2013_11_30>11</_2013_11_30> 
    <_2013_12_31>12</_2013_12_31> 
    <FY_2013>r</FY_2013> 
    <_2014_01_31>1</_2014_01_31> 
    <_2014_02_28>2</_2014_02_28> 
    <_2014_03_31>3</_2014_03_31> 
    <_2014_04_30>4</_2014_04_30> 
    <_2014_05_31>5</_2014_05_31> 
    <_2014_06_30>6</_2014_06_30> 
    <_2014_07_31>7</_2014_07_31> 
    <_2014_08_31>8</_2014_08_31> 
    <_2014_09_30>9</_2014_09_30> 
    <_2014_10_31>10</_2014_10_31> 
    <_2014_11_30>11</_2014_11_30> 
    <_2014_12_31>12</_2014_12_31> 
    <FY_2014>t</FY_2014> 
</Row> 

</Root> 

그리고 내 searchXML 코드 :

function searchXML(xml, goalTab, goalCategory){ 
    console.log('in search xml'); 
    //get the current year in 4 digits (yyyy) 
    var year = new Date().getFullYear(); 

    //gets the string value of the 2 digit number of the previous completed month (ie: currMonth = April (04), prevMonth = March (03)) 
    var prevMonth = new Date().getMonth().toString(); 
    if(prevMonth.toString().length == 1){ 
     prevMonth = '0'+prevMonth.toString(); 
    } 

    //check for leap year 
    if(year % 4 == 0){ 
     var feb = 29; 
    }else{ 
     var feb = 28; 
    } 

    //make array for number of days per month in this year 
    var daysInMonths = [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 


    //get the row offset for the particular month 
    var rowOffset_Month = (year - 2013)*12 + 2 + parseInt(prevMonth); 

    var result = null; 

    $(xml).find('Row').each(function(){ // for each Row in xml 
     console.log('-------new row------') 
     var row = this; 
     var boolTab = $(row).find('Tab').text() == goalTab; 
     var boolCategory = $(row).find('Category').text() == goalCategory; 
     console.log(boolCategory); 
     console.log(boolTab); 

     if (boolCategory && boolTab) { 
      console.log('found match'); 
      var result= { 
       //get the row that corresponds with the calculated row offset 
       //month : arr[rowOffset_Month][i], 
       month : $(row).find('_'+year+'_'+prevMonth+'_'+daysInMonths[parseInt(prevMonth) - 1]).text(), //-----------------check for errors here-------------------- 

       //get the last row, which corresponds with the 2014 ytd 
       // ytd : arr[arr[1].length - 1][i] 
       ytd : $(row).find('FY_' + year).text() //-----------------check for errors here-------------------- 
      }; //END result obj 
     };// END if 
    });// END jquery function 

    return result; 
}; 

그리고 별도의 함수 :

var ann_appStarts_plan = searchXML(xml, "MF_Act", "Product Store Sessions "); 
console.log('plan month: ' + ann_appStarts_plan.month); 
console.log('plan ytd: ' + ann_appStarts_plan.ytd); 

그리고 방화범에 오류 :

TypeError: ann_appStarts_plan is null 
    console.log('plan month: ' + ann_appStarts_plan.month); 
+0

어떻게 문제를 해결하겠습니까? xml의 ​​특정 요소를 찾기 위해 JQuery를 사용하는 동기식 방법이 있습니까? – YazanLpizra

+2

'find()'호출에 대해 비동기적인 것은 없습니다. Ajax 또는 다른 네트워크 서비스 호출이 아닙니다. –

답변

1

당신은 "외부"result 만드는 :

var result = null; 

$(xml).find('Row').each(function(){ // for each Row in xml 
// ... 

다음 result 새로운 "내부"에 할당 :

if (boolCategory && boolTab) { 
     console.log('found match'); 
     var result= { 
     // .. 
     }; 

후 삭제됩니다, 우리는 원래의 반환 :

return result; 

할당에서 var를 잃습니다. 내부 기능이 이제까지 false을 반환하는 경우

if (boolCategory && boolTab) { 
    result= { 
    month : $(row).find('_'+year+'_'+prevMonth+'_'+daysInMonths[parseInt(prevMonth) - 1]).text(), 

    ytd : $(row).find('FY_' + year).text() 
    }; 

    return false; 
}; 

와 일치하는 항목이 발견 된 것을 지금 each() 루프를 종료 false를 반환은 (each()은에라고 목록에있는 각 개체에 대해 한 번 내부 함수를 호출하지만,이 중지됩니다).

+0

false를 반환하면 함수가 전체적으로 올바르게 반환됩니다. 아니면 루프에서 빠져 나올 것입니까? – YazanLpizra

+0

아니, 그냥 루프 밖으로 나옵니다. 그것은'each()'내의 내부 function()으로부터 돌아옵니다. 바깥 쪽'return result; '는 여전히 유효하지만, 이제는 반환하는 데 유용한 것이 있습니다. –

+0

달콤한 작품. 대단히 감사합니다 :). 그리고 그것은 의미가 있습니다. 실제로 'var false'를 추가하지 않고 var를 단독으로 제거합니다. – YazanLpizra

1

.find() 메서드가 무엇인지 모르겠지만 해당 콜백 함수 내에 result의 재 선언이 문제 일 가능성이 큽니다. 비동기식이면 어쨌든 전체 코드가 작동하지 않습니다.

데려가 여기 var :

 var result= { 

다른 변수, 콜백 내부를 만드는 것이다.

관련 문제