Javascript函数中的数组范围在内部AJAX循环之外为空

Javascript函数中的数组范围在内部AJAX循环之外为空,javascript,jquery,arrays,ajax,Javascript,Jquery,Arrays,Ajax,我目前正在阅读,这似乎与我下面的代码无法按预期工作的原因有关。getJSON for循环之后的My console.log在循环之前执行,因此返回null。getJSON循环中的console.log返回推送到数组中的对象 在多次阅读参考答案后,我对如何在回调或承诺中实现解决方案感到更加困惑。我需要在下面的代码中执行什么操作才能使用回调或承诺,以便outer console.log返回数据 function channel() { var channels = ["ESL_SC2", "

我目前正在阅读,这似乎与我下面的代码无法按预期工作的原因有关。getJSON for循环之后的My console.log在循环之前执行,因此返回null。getJSON循环中的console.log返回推送到数组中的对象

在多次阅读参考答案后,我对如何在回调或承诺中实现解决方案感到更加困惑。我需要在下面的代码中执行什么操作才能使用回调或承诺,以便outer console.log返回数据

function channel() {
    var channels = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"];
    var channelData = [];

    for(var x = 0; x < channels.length; x++) {
        $.getJSON(`https://api.twitch.tv/kraken/channels/${channels[x]}?callback=?`, function(data) {
          console.log(data.display_name);
        //   console.log(data);
          channelData.push( { display_name:data.display_name, logo:data.logo, url:data.url, game:data.game, status:data.status } );
          console.log(channelData);
        });
    }
    console.log(channelData);
}
功能通道(){
var通道=[“ESL_SC2”、“OgamingSC2”、“cretetion”、“freecodecamp”、“storbeck”、“habathcx”、“RobotCaleb”、“Noobs2nijas”];
var channelData=[];
对于(var x=0;x
$。getJSON是一个非同步函数,因此代码在继续之前不会等待响应。也就是说,代码将通过for循环运行,发出多个异步调用,然后立即调用outer console.log

要正确执行外部“console.log”,您必须向通道函数添加回调函数,并且只要异步调用有响应,就会调用该函数

例如:

function channel(callback) {
    var channels = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"];
    var channelData = [];

    for(var x = 0; x < channels.length; x++) {
        $.getJSON(`https://api.twitch.tv/kraken/channels/${channels[x]}?callback=?`, function(data) {
          console.log(data.display_name);;
          channelData.push( { display_name:data.display_name, logo:data.logo, url:data.url, game:data.game, status:data.status } );
          return callback(channelData);
        });
    }
}

channel(function(response) {
    console.log(response); // Where response is your channel Data
    /* do something with the return channel data */
    // Note this function will be called multiple times
})
函数通道(回调){
var通道=[“ESL_SC2”、“OgamingSC2”、“cretetion”、“freecodecamp”、“storbeck”、“habathcx”、“RobotCaleb”、“Noobs2nijas”];
var channelData=[];
对于(var x=0;x
$。getJSON是一个非同步函数,因此代码在继续之前不会等待响应。也就是说,代码将通过for循环运行,发出多个异步调用,然后立即调用outer console.log

要正确执行外部“console.log”,您必须向通道函数添加回调函数,并且只要异步调用有响应,就会调用该函数

例如:

function channel(callback) {
    var channels = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"];
    var channelData = [];

    for(var x = 0; x < channels.length; x++) {
        $.getJSON(`https://api.twitch.tv/kraken/channels/${channels[x]}?callback=?`, function(data) {
          console.log(data.display_name);;
          channelData.push( { display_name:data.display_name, logo:data.logo, url:data.url, game:data.game, status:data.status } );
          return callback(channelData);
        });
    }
}

channel(function(response) {
    console.log(response); // Where response is your channel Data
    /* do something with the return channel data */
    // Note this function will be called multiple times
})
函数通道(回调){
var通道=[“ESL_SC2”、“OgamingSC2”、“cretetion”、“freecodecamp”、“storbeck”、“habathcx”、“RobotCaleb”、“Noobs2nijas”];
var channelData=[];
对于(var x=0;x
getJSON方法返回一个Promise,因此您可以等待它们全部完成。将所有
$.getJSON
调用推送到一个数组中,并将该数组传递给
$。当
:

var channels = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"];

$.when.apply($, channels.map(x => $.getJSON(`https://api.twitch.tv/kraken/channels/${x}?callback=?`)))
  .then(function(){
    // here you'll have all the responses
    console.log(arguments)
  })
功能通道(){
var通道=[“ESL_SC2”、“OgamingSC2”、“cretetion”、“freecodecamp”、“storbeck”、“habathcx”、“RobotCaleb”、“Noobs2nijas”];
var channelData=[];
var获取=[];
var success=函数(数据){
channelData.push({
display\u name:data.display\u name,
logo:data.logo,
url:data.url,
游戏:data.game,
状态:data.status
})
};
对于(var x=0;x

方法
$.getJSON
返回一个承诺,因此您可以等待所有承诺完成。将所有
$.getJSON
调用推送到一个数组中,并将该数组传递给
$。当
:

var channels = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"];

$.when.apply($, channels.map(x => $.getJSON(`https://api.twitch.tv/kraken/channels/${x}?callback=?`)))
  .then(function(){
    // here you'll have all the responses
    console.log(arguments)
  })
功能通道(){
var通道=[“ESL_SC2”、“OgamingSC2”、“cretetion”、“freecodecamp”、“storbeck”、“habathcx”、“RobotCaleb”、“Noobs2nijas”];
var channelData=[];
var获取=[];
var success=函数(数据){
channelData.push({
display\u name:data.display\u name,
logo:data.logo,
url:data.url,
游戏:data.game,
状态:data.status
})
};
对于(var x=0;x
函数获取数据(通道){
返回新承诺(功能(解决、拒绝){
试一试{
$.getJSON(`https://api.twitch.tv/kraken/channels/${channel}?回调=?`,函数(数据){