我以为我得到了回调,但是我无法让他们在我设置的这个小问题上工作以了解这个概念:
我有一个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 ...
我做错了什么?
答案 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>