0

문제점 : REST API 호출에서 데이터를 가져 와서이를 변수에 할당하고이를 다른 함수 또는 용도의 입력으로 사용하려고합니다.REST YOUTUBE DATA API 3의 데이터를 콜백 외부 변수에 지정 함수 Jquery

기능 : 내가

var title = getSongName(youtubeID, function(name) { 
            console.log("song name is :"+name); 
           }); 

와 다른 장소에서이 함수를 호출하고

function getSongName(id, callback) { 
     var apikey = {My_TOKEN}; 
     var fetchInformation = "https://www.googleapis.com/youtube/v3/videos?key=" +apikey +"&fields=items(snippet(title" +"))&part=snippet&id=" +id; 
     $.getJSON(fetchInformation, function (jsonData) { 
      fullname = jsonData.items[0].snippet.title; 
      callback(fullname); 
     }); 
    } 

필요에 따라 내가 CONSOLE.LOG의 값을 얻는다. 는 지금은 j 그래서 나는 "getSongName"호출 내에서 사용할 수없는 다른 장소에서오고 여기

z.innerHTML = '<b>' + title + 'num: ' + j + '</b>'; 

에서이 제목을 사용하고 싶습니다.

내부에는 console.log을 수행하는 것이 아니라 실제로 다른 변수에 "이름"을 할당하고 내가 원하는 것처럼 사용합니까?

이 작업을 수행하는 또 다른 방법이 있는지 모르겠지만 어떤 도움도 받으실 수 없습니다.

이 해결 ----------- STEPS 내가 나에게 값을 얻기 위해 위의 함수를 호출 루프에서 실행되는 다른 함수 내에서 다음

function getSongName(youtubeID, idForPlayer,i, z, callback) { 
    var apikey = {My_TOKEN}; 
    var fetchInformation = "https://www.googleapis.com/youtube/v3/videos?key=" +apikey +"&fields=items(snippet(title" +"))&part=snippet&id=" +id; 

//$.ajaxSetup({'async':false}); WILL return the value for each loop and not do it asynchronously which had me pulling my hair out. P.S. this was the reason only one value was being returned 
$.ajaxSetup({'async':false}); 
     $.getJSON(fetchInformation, function (jsonData) { 
      debugger; 
      var fullname = jsonData.items[0].snippet.title; 
      boolean = false; 
      if (fullname) { 
       boolean = true; 
       if (boolean){ 
        console.log("song name inside the gerSongName loop is: " + i +" ", fullname); 
        callback(fullname); 
       } 
       debugger; 
      } 
      else { 
       debugger; 
       console.log("No song name"); 
      } 

     }); 
    } 

아래에 언급.

getSongName(youtubeID, idForPlayer,i, z, function(name) { 
            z.innerHTML = '<b>' + name + '</b>'; 
            debugger; 
            document.getElementById('elementTagID').appendChild(z); 

           }); 

희망이 있으면 다른 사람에게 도움이됩니다. 감사합니다.

+0

[비동기 호출의 응답을 어떻게 반환합니까?] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call)의 가능한 복제본) –

답변

0

당신은 함수의 외부에서이 같은 VAR 선언 넣을 수 :

var fullname = ""; 

function getSongName(id, callback) { 
     var apikey = {My_TOKEN}; 
     var fetchInformation = "https://www.googleapis.com/youtube/v3/videos?key=" +apikey +"&fields=items(snippet(title" +"))&part=snippet&id=" +id; 
     $.getJSON(fetchInformation, function (jsonData) { 
      fullname = jsonData.items[0].snippet.title; 
      callback(); 
     }); 
    } 

을하지만 호출이 비동기이기 때문에, VAR은 내가 더 생각 .. 제가 질문을 이해 callback.If 후 값을 가져옵니다 당신이 로깅 할 때처럼 콜백을 직접 사용할 수 있습니다.

+0

고맙습니다. 'z.innerHTML = ''+ 제목 + 'num :'+ j + ''; 또한 'fullname'에 할당 된 데이터는 어디에 있습니까? – RonitInfinity

+0

로깅과 마찬가지로 콜백 기능이 있어야합니다. 필자의 샘플에서는 getSongName을 호출 할 때 전달되는 함수 안에이 행을 넣을 것이다. getSongName (1, function() {z.innerHTML = ''+ 제목 + 'num :'+ 전체 이름 + ''; }); 그러나 fullame은 콜백 함수 밖에서 다른 용도로 계속 사용할 수 있습니다. –

0

아마 다른 접근 방식을 취하고 여기에 구조를 변경 것 :

z.innerHTML = '<b><span class="title"></span>num: ' + j + '</b>'; 

을 그리고 콜백에서 :

document.querySelector('.title').textContent = name; 

또는는 TextContent를 지원하지 않는 브라우저를위한

:

document.querySelector('.title').innerHTML = name; 

다음 plunk를 참조하십시오. https://plnkr.co/edit/k5Evt98M5fiOazU7tpKU

+0

이 방법이 효과적 일 수도 있지만 문제는,이'z.innerHTML'을 동적으로 만들어서 솔루션을 적용하면 많은 이름 중에서 마지막 이름 만 인쇄됩니다. 또한 고려해 볼 때, 나는'j'가 역동적이기를 원합니다. – RonitInfinity

+0

다른 코드를 보지 않고서는 약간 어려워 보이지만, 코드 작성을 위해 https://plnkr.co/edit/k5Evt98M5fiOazU7tpKU를 작성했습니다. 아마도 도움이 될 것입니다. 왜 성이 인쇄 될지는 모르겠지만 어쩌면 당신은 우리가 보지 못하는 어딘가에서 돌아 다니는 루프를 가지고 있을지 모르겠습니다. – Chris

+0

Chris에게 고마워. 나는 그것을 마침내 얻었다!! 그래서 내가 한 것은 함수에서 데이터를 빼내는 대신 함수에 다른 데이터를 주입하고 그 내부에 증서를 작성한 것입니다. 초기 질문을 업데이트하여 내가 참조한 내용을 보여줄 것입니다. 다른 사람들이 많은 시간을 절약하도록 도울 수 있습니다. 감사합니다. – RonitInfinity