2017-08-22 25 views
-2

结果我希望登录:[“freecodecamp”,“twitchtv”,“运动”]Array.length是3,但会记录一个“空”数组

我读过关于Asynchronous situation一堆帖子这解释了为什么我在控制台上获得这些“空[]”:
“空”意味着它看起来像这样:[],
rathan than this:['freecodecamp','twitchtv','exercise']。

什么我越来越至今:如果的console.log(online_streamer)放置如下场景:

A.(在回调的getJSON)---日志:未定义,然后在打印最终的“可用”数组之前,有几行空白[],其中包含3个项目(玩家名字)。如果我按下向下箭头按钮,则只有3个项目的数组才能显示。再次,(Async situation.)

我的问题: 我是不是放错了consoe.log或者我需要一些完成不同的功能打印可用阵列状:“物品1”,“ITEM2”,“项目3”]像场景的最后一次迭代A.)?多谢你们。

function getOnlineGamers(){ 
    var online_gamers = []; 
    for (var i=0; i<gamers.length; i++){ 
     //(gamers is a defined array with 11names of 11gamers.) 

     $.getJSON(url+"streams/"+ gamers[i]+cid).done(function(data){ 
      if(data.stream === null){ 
      }else { 
       var name= data.stream.channel.name; 
       online_gamers.push(name); 
      } 
      console.log(online_gamers); // <--- A 
     }); 
    }; 
    console.log(online_gamers); //<--- B 
}; 

console.log(getOnlineGamers()) 
+0

getOnlineGamers()不返回任何东西,所以登录就不会记录任何有用的东西。你需要使用适当的“异步返回”技术。 – Carcigenicate

+0

可能重复[如何从异步调用返回响应?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Carcigenicate

+0

第一个空数组来自'B',然后来自'console.log(getOnlineGamers())'的'undefined',*然后*'A'可能会记录一些东西。 – deceze

回答

0

你必须等待每个分辨率, 那么你可以用得到的阵列工作。

function getOnlineGamers(gamers, cid) { 

    return Promise 
    .all(gamers.map(function(game) { 
     return $ 
     .getJSON(url + "streams/" + game + cid) 
     .then(function(data) { 

      return data.stream && data.stream.channel.name; 
     }) 
     ; 
    })) 
    ; 
}  


getOnlineGamers([123, 321, 231], 'foobaz') 
    .then(function(names) { 

    console.log('names', names); 
    }) 
; 
相关问题