JavaScript - 只评估if语句的第一部分

时间:2016-04-30 10:08:18

标签: javascript json asynchronous conditional

在我的代码中,我循环遍历一个Twitch.tv用户名(称为用户)数组,以便与每个用户名进行API调用。代码如下:

for(user in users){
  var username = users[user];
  console.log(username); //it iterates over every user in the array
  cbJSON(username); //that means this function is called for each user
}

cbJSON函数接受一个参数,即用户名,并进行API调用。然后,如果用户在线,离线或不存在,则应写入控制台。为此,我使用if语句来评估data.stream是否为true,null或undefined如下:

function cbJSON(name){
  $.getJSON(url + name + cb, function(data){
  var ds = data.stream;

  //Problem: Only the initial if statement works.
  //The else if and else statements are NEVER called

  //Only this works
  if(ds){
    //handle user is online
      //show status, name, game, viewers, resolution

    console.log(name + ' is online.');

    //this is never called, even though it should be
  } else if(ds === null) {
    //handle user is offline
      //show status, logo and name
    console.log(name + ' is offline.');

    //this is never called, even though it should be
  } else {
    //handle user does not exist
      //error message: user does not exist
    console.log(name + ' does not exist.');
  }
  });
}
只要data.stream存在且不是假的,

ds应该评估为true 当流脱机时,ds等于null 当通道不存在时,ds等于未定义。

如果此if语句似乎得到评估,则只有第一部分。如果users阵列中有人在线,则“用户名在线”将被写入控制台。但是,阵列中的大多数用户都处于脱机状态,而且一个用户不存在,因此这些用户也应该以“用户名离线”和“用户名不存在”的形式写入控制台。

这是一个相当简单的if语句,我不认为我在这里遇到任何麻烦,但我无法弄清楚为什么这不能按预期工作。我只想在这里链接我的codepen,因为问题可能存在于其他地方:http://codepen.io/erody-s/pen/WwagBo?editors=1011

还有一件事:if语句昨天正在运行,但从那时起我改变了一堆东西,包括如何调用cbJSON函数,并且它已经停止正常工作。

我对JavaScript仍然有些新意,所以很可能我在这里遗漏了一些明显的东西,但我无法自己解决这个问题。相信我,我试过了。

如果有人能够帮助我,我会很高兴。

2 个答案:

答案 0 :(得分:0)

发现错误。

在分配ds

后,您会进行一系列分配
var ds = data.stream;
var linkStream = ds.channel.url;
var logo = ds.channel.logo;
var displayName = ds.channel.display_name;
var game = ds.game;
var viewers = ds.viewers;
var resolution = ds.video_height;
var preview = ds.preview.small; 

你还说过当流媒体离线时,ds应该是空的吗?好吧,在Javascript中,如果你试图获取null或undefined变量的属性,你将抛出一个错误,其余的函数将不会被执行。 所以,我为你修好了你的笔:http://codepen.io/josepht404/pen/RaqbRw?editors=1012它现在有用了:)。

我希望我帮忙,谢谢。

答案 1 :(得分:-1)

function cbJSON(name){
  $.getJSON(url + name + cb, function(data){
  var ds = data.stream;
     console.log(ds); //
  });
}

ds是一个永远是真实的对象。您需要在ds上找到可根据用户的在线/离线状态进行评估的属性。

Object:
{
   _id:21070202752,
   _links:Object,
   average_fps:60,
   channel:Object,
   created_at:"2016-04-30T08:02:01Z",
   delay:0,
   game:"Minecraft",
   is_playlist:false,
   preview:Object,
   video_height:698,
   viewers:299,
   __proto__:Object
 }

这是ds对象。