超基本的javascript回调

时间:2017-03-25 17:21:16

标签: javascript jquery json callback

我以为我得到了回调,但是我无法让他们在我设置的这个小问题上工作以了解这个概念:

我有一个Twitch.tv流媒体列表(我因为freecodecamp问题而陷入困境)和一个空数组:

var players = ["imaqtpie", "imaqtpie"]; //this guy's always online. It's just easier.
var games = [];

我试图做的就是让每个流媒体玩这个游戏并将其传递给游戏"页面加载时的数组。

我有这个:

var players = ["imaqtpie", "imaqtpie"];
var games = [];

function functionUNO(callback) {

    var a;

    for(i = 0; i < players.length; i++) {
      a = $.getJSON('https://wind-bow.gomix.me/twitch-api/streams/' + players[i] + '?&callback=?');
        games.push(a);
    };

    callback();

};

function functionDOS() {
    console.log(games);
};

$(document).ready(function(){

    functionUNO (function() {
        functionDOS();
    });

    });

正确返回我的数组中的 json ,但我无法弄清楚如何只获取游戏

我试过

var a = $.getJSON('https://wind-bow.gomix.me/twitch-api/streams/' + players[i] + '?&callback=?', function(json) {return json.stream.game});

哪个不起作用,

var a = $.getJSON('https://wind-bow.gomix.me/twitch-api/streams/' + players[i] + '?&callback=?', functionTRES);   

使用单独的功能TRES

function functionTres(data) {
    games.push(data.stream.game);
}; 

返回游戏 json ...

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您需要使用jQuery.when(),因为callback()一旦所有承诺都得到满足就应该被取消。由于games是一个数组,我们需要使用apply()

$.when.apply($, games).then(function() {
    callback();
});

而不是

callback();

注意:根据当前代码games是承诺的arrau。

答案 1 :(得分:0)

您的代码存在问题,即您正在推动a

返回的承诺$.getJSON(.. )

这需要改变,以便不是推动它,而是在监听promise的返回,并使用其中包含的数据。既然你处于循环中,你也必须等待所有的承诺返回,即使这不是最好的方法,我所做的只是留下一个基本的退出策略,让你看看我的意思。

只有这样才能记录games数组中的内容。我修改了你的代码并在下面添加了它,以便你了解我的意思。

值得注意的是,循环的最后一次迭代不一定是返回的最后一个承诺,如@Christopher的评论所述

@Satpal的回答中提到的更好的方法是使用promise聚合器,例如$.when()

var players = ["imaqtpie", "imaqtpie"];
var games = [];

function functionUNO(callback) {

  var a;

  for (i = 0; i < players.length; i++) {
    $.getJSON('https://wind-bow.gomix.me/twitch-api/streams/' + players[i] + '?&callback=?').then(function(data) {
      games.push(data);
      if (i == players.length) {
        callback();
      }
    });

  };
};

function functionDOS() {
  console.log(games);
};

$(document).ready(function() {

  functionUNO(function() {
    functionDOS();
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>