2013-06-28 7 views
4

나는 모든 종류의 잘못하고있다 확신합니다.하지만 콘솔에서 동일한 위치에서 원하는 값을 console.log() 수있는 다음과 같은 함수를 'undefined'반환합니다. 함수가 코드에 주석으로 표시됩니다. javascript 함수는 정의되지 않은 반환합니다

var tags = [4, 5]; 
console.log(getTagNames(tags)); // 'undefined' 

function getTagNames(tagArray) { 

    $.getJSON('js/tags.json', function(data) { 
     for (var i in tagArray) { 
      tagArray[i] = tagArray[i].toString(); 
      var val = tagArray[i]; 

      for (var t in data) { 
       var tag = data[t]; 
       var tagName = tag.alias; 
       var tagId = tag.id; 
       if (val === tagId) { 
        tagArray[i] = tagName; 
       } 
      }; 
     } 
     console.log(tagArray); // output ["foo", "bar"] 
     return tagArray; 
    }); 
} 

다른 이상한 것은

브라우저에서이 코드를 실행 한 후, 나는 브라우저 콘솔에 "태그"를 입력 할 수 있다는 것입니다 그리고 그것은 나에게 올바른 결과 ["foo", "bar"]을 제공합니다. 그러나 태그 변수 (예 : 요소 등의 텍스트 값)를 사용하면 효과가 없습니다 ... 무엇이 제공됩니까? JavaScript는 제 첫 번째 언어가 아니므로 JavaScript가 작동하는 방식을 약간 혼동합니다. 나는 이해하지 못한다.

"이미 내 대답이있을 수있는 질문"을 거의 읽었지만 내 기능에 적용하는 방법을 알 수없는 경우 대답이 제공되었습니다.

참고 : json으로는 줌라 (3.1) 태그 테이블에서입니다

  1. .
  2. 데이터를 검색 할 수 있습니다.
  3. val === tagId 조건부가 올바르게 작동하고 있습니다.
  4. 나는 팝콘을 좋아한다. 당신의 getTagNames가 실행이 완료된 후에 방법 -
+1

'getTagNames' **에는 ** return 문이 없습니다. 질문에'return' 문을 사용하는 유일한 함수는'getJSON'에 전달하는 익명 함수입니다. – Quentin

답변

9

getJSON을 호출하면 콜백 함수가 비동기 적으로 호출됩니다. 이런 식으로 전화를

function getTagNames(tagArray, cb) { 

    $.getJSON('js/tags.json', function(data) { 
     for (var i in tagArray) { 
      tagArray[i] = tagArray[i].toString(); 
      var val = tagArray[i]; 

      for (var t in data) { 
       var tag = data[t]; 
       var tagName = tag.alias; 
       var tagId = tag.id; 
       if (val === tagId) { 
        tagArray[i] = tagName; 
       } 
      }; 
     } 
     console.log(tagArray); // output ["foo", "bar"] 
     cb(tagArray); 
    }); 
} 

다음합니다 :

당신은 당신이 콜백 함수 자체를 취할 수 있도록 변화를 만들 수있는 코드에서 많은 장소를 기능 getTagNames이 필요하고 그것을 호출하는 경우

getTagNames(tags, function(tagArray) { 
    // do something with tagArray 
}); 
+0

getTagNames 함수를 호출 할 필요가 없을 때 "콜백"함수를 사용한다고 생각합니다. 매개 변수와 마찬가지로 tagArray가 여기에 표시됩니다. 그리고 내가 그걸로 무엇을하고 싶습니까. 나는 단지 값을 반환에 너무 PHP를 사용하는 것 같아요. – jremydeaton

+1

tagArray는 원본의 (대부분의 코드와 마찬가지로) 복사됩니다. 따라서 getTagNames를 호출하여 tagArray가 채워집니다. 전달하는 두 번째 매개 변수는 getTagNames에 대한 호출이 "완료"되면 "반환 값"을 처리하는 함수입니다. – mbanzon

2

return tagArray; 반환 success, 첫째, 모든 반환 값을 기대하지 않으며, 둘째, 비동기 적으로 발생 getJSON의 핸들러의 결과.

+1

내가 훑어 본 다른 질문에서 얻은 대답은 그다지 답이 아니며, 어떻게 작동하는지 절반 만 이해합니다. 그러나 나는 전체 개념에 대한 나의 현재 이해를 위해 벙어리 다운 된 참고 자료를 찾을 수없는 것 같다. 일부 자료를 읽는 동안 "AH HA"순간을 맞을 수 있습니다. 누구든지 나를지도 할 수있는 곳 (가급적이면 튜토리얼 기반)은 대단히 감사하겠습니다. – jremydeaton

관련 문제