0

问题:我想从REST API调用中获取数据并将其分配给一个变量,并将其用作另一个函数或目的的输入。将数据从REST YOUTUBE DATA API 3分配给回调之外的变量函数Jquery

功能:

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

我打电话在另一个地方这个功能与

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

我得到的console.log值的要求。 现在我想用这个标题

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

这里j是从别的地方来,所以我不能用它的“getSongName”电话里面。

有没有一种方法不仅仅是在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 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(); 
     }); 
    } 

,但呼叫异步的,所以只变种后callback.If获得价值我明白这个问题。我觉得它更直接像使用日志记录一样直接使用回调。

+0

谢谢。你会把这个'z.innerHTML =''+ title +'num:'+ j +'';'? 另外哪里是分配给'fullname'的数据? – RonitInfinity

+0

应该在回调函数内部,就像你做记录一样。在我的示例中,我将把该行放在调用getSongName时传递的函数中。像这样:getSongName(1,function(){z。innerHTML =''+ title +'num:'+ fullname +''; });但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

相关问题