首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TV JSON API问题

TV JSON API问题
EN

Stack Overflow用户
提问于 2016-08-29 01:42:56
回答 4查看 413关注 0票数 1

因此,我尝试使用twitch:https://codepen.io/sterg/pen/yJmzrN

如果您检查我的代码页,您会发现每次我刷新页面时,状态顺序都会发生变化,我不知道为什么会发生这种情况。这是我的javascript:

代码语言:javascript
复制
$(document).ready(function(){
    var ur="";
    var tw=["freecodecamp","nightblue3","imaqtpie","bunnyfufuu","mushisgosu","tsm_dyrus","esl_sc2"];
    var j=0;
    for(var i=0;i<tw.length;i++){   
        ur="https://api.twitch.tv/kraken/streams/"+tw[i];

        $.getJSON(ur,function(json) {

            $(".tst").append(JSON.stringify(json));
            $(".name").append("<li> <a href="+"https://www.twitch.tv/"+tw[j]+">"+tw[j]+"</a><p>"+""+"</p></li>");

            if(json.stream==null){
                $(".stat").append("<li>"+"Offline"+"</li>");

            }
            else{
                $(".stat").append("<li>"+json.stream.game+"</li>"); 

            }
            j++;
    })

    }


});
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-29 02:08:56

$.getJSON()异步工作。在返回结果之前不会返回JSON。API可以以与发出的请求不同的顺序返回,因此您必须处理这个问题。

实现这一目标的一种方法是使用允诺API和$.when()一起将所有请求捆绑为一个大的承诺,这将作为一个整体成功或失败。这还确保响应数据按预期顺序返回给您的代码。

试试这个:

代码语言:javascript
复制
var channelIds = ['freecodecamp', 'nightblue3', 'imaqtpie', 'bunnyfufuu', 'mushisgosu', 'tsm_dyrus', 'esl_sc2'];
$(function () {
  $.when.apply(
    $, 
    $.map(channelIds, function (channelId) {
      return $.getJSON(
        'https://api.twitch.tv/kraken/streams/' + encodeURIComponent(channelId)
      ).then(function (res) {
        return {
          channelId: channelId,
          stream: res.stream
        }
      });
    })
  ).then(function () {
    console.log(arguments);
    var $playersBody = $('table.players tbody');
    $.each(arguments, function (index, data) {
      $playersBody.append(
        $('<tr>').append([
          $('<td>'),
          $('<td>').append(
            $('<a>')
              .text(data.channelId)
              .attr('href', 'https://www.twitch.tv/' + encodeURIComponent(data.channelId))
          ),
          $('<td>').text(data.stream ? data.stream.game : 'Offline')
        ])
      )
    })
  })
});

https://codepen.io/anon/pen/KrOxwo

在这里,我使用$.when.apply()与数组一起使用$.when,而不是使用参数列表。接下来,我使用$.map()将通道ID数组转换为每个ID的承诺数组。在此之后,我有一个简单的助手函数,它处理正常响应(res),提取相关的流数据,同时附加channelId供以后使用。(如果没有这种情况,我们必须返回原始数组才能获得ID。您可以这样做,但在我看来,这不是最佳实践。我更喜欢将数据保存在响应中,这样以后重构就不太可能破坏某些内容。这是优先考虑的问题。)

接下来,我有一个.then()处理程序,它接收所有数据并循环它们。这些数据作为参数返回给函数,所以我只需使用$.each()来迭代每个参数,而不必将它们命名出来。

我在处理HTML的方式上也做了一些改变。您将注意到,我使用$.text()$.attr()来设置动态值。这确保了HTML是有效的(因为您实际上根本没有对动态位使用HTML )。否则,可能有人有<script src="somethingEvil.js"></script>的用户名,并且它会在您的页面上运行。这完全避免了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2016-08-29 01:57:09

看起来,每次刷新时,您都会使用j计数器变量,以相同的顺序追加“显示名称”。

但是,当每个请求返回时,您都会附加“状态”。由于这些HTTP请求是异步的,所以每次重新加载页面时,它们被追加到文档的顺序都会有所不同。

如果希望状态保持相同的顺序(匹配显示名称的顺序),则需要在每个API调用返回时存储响应数据,并在将其附加到正文之前自己对其进行排序。

票数 0
EN

Stack Overflow用户

发布于 2016-08-29 02:01:44

起初,我将最后一个else条件(打印出流媒体游戏的条件)改为$(".stat").append("<li>"+jtw[j]+": "+json.stream.game+"</li>"); --它的含义与您试图实现的目标相同,但产生了相同的错误。

在您创建的列表和您收到的数据中存在差异。与它们没有直接关联。

这是使用$(".stat").append("<li>"+json.stream._links.self+": "+json.stream.game+"</li>");的首选方式,在最坏的情况下,您甚至可以使用regex或substr获取用户名。

只要您不运行用于上载列"DisplayName“和"Status”的单独循环,您甚至可以将它们分开,以防您不想像我的示例那样将它们写入同一行。

无论您选择哪种方式,问题在于“状态”列的上传顺序与您在“状态名称”中所做的不完全相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39197448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档