2017-06-21 92 views
1

我正在使用Twitch的API(由于CORS的替代链接)。运行时,html会回到空白状态。是因为回调,我能做些什么来获取数据?我可以确认该链接的工作原理,并尝试通过它没有运气。API调用循环

let usernames = ['freecodecamp']; 
let api = ''; 
let html = ''; 

    for(let i = 0; i < usernames.length; i++) { 
    api = 'https://wind-bow.gomix.me/twitch-api/streams/' + usernames[i] + '?callback=?'; 
    $.getJSON(api, function(data) { 
     let online = data.stream == null; 
     if(online) { 
     html += usernames[i] + '\nStatus: Offline'; 
     } 
     else { 
     html += usernames[i] + '\nStatus: Online'; 
     } 
    }); 
    } 
    if(html != '') { 
    $('#data_display').html('<h1>' + html + '</h1>'); 
    } 
+0

首先摆脱'+'?callback =?''。另外,不妨使用'glitch.me'而不是'gomix.me'。 (后者重定向到前者。)之后,粘贴更新的代码,并告诉我们是否仍有问题。 – smarx

+0

'$ .getJSON'是一个异步进程。当然你的'html'在你放入'#data_display'时是空的。然后,避免xhr-ing在循环中 – choz

回答

0

把你的最后追加的HTML块的getJSON中:

$.getJSON(api, function(data) { 
    let online = data.stream == null; 
    if(online) { 
    html = usernames[i] + '\nStatus: Offline'; 
    } 
    else { 
    html = usernames[i] + '\nStatus: Online'; 
    } 
    $('#data_display').append('<h1>' + html + '</h1>'); 
}); 

,还可以使用.append代替.html,否则将取代#data_display内的HTML。

有没有必要做html += ....

+0

这样做的窍门,谢谢! – Weston

0

我认为JavaScript的承诺,将与您的情况帮,带的jQuery递延API作为一个例子:

function fetchUserStatus(username) { 
    var defer = jQuery.Deferred(); 
    var api = 'https://wind-bow.gomix.me/twitch-api/streams/' + username + '?callback=?'; 
    $.getJSON(api, function(data) { 
    let online = data.stream == null; 
    if (online) { 
     defer.resolve('Offline'); 
    } else { 
     defer.resolve('Online'); 
    } 
    }); 
    return defer.promise(); 
} 

let usernames = ['freecodecamp']; 
let promises = []; 
for (let i = 0; i < usernames.length; i++) { 
    promises.push(fetchUserStatus(usernames[i])); 
} 
$.when.apply($, promises).then(function() { 
    let html = ''; 
    for (let i = 0; i < arguments.length; i++) { 
    html += usernames[i] + '\nStatus: ' + arguments[i]; 
    } 
    $('#data_display').append('<h1>' + html + '</h1>'); 
}); 

jQuery的时候不支持传递数组承诺,这就是使用apply函数的原因,并且在回调函数中,您需要使用arguments来引用promise中已解析的所有值。

希望这会有所帮助。