同时Ajax调用JS返回数据错误
Simultaneous Ajax Calls JS Returning Data Incorreclty
我试图通过两个不同的 ajax 调用将字符串放入数组中。然后使用字符串名称的 id 创建 div,并包含有关从 ajax 请求流式传输哪些 twitch 流媒体的数据。
问题是我正在努力使元素通过第一个 ajax 调用然后通过第二个调用,因为 ajax 调用是异步的。因此,数组中的元素将在第一个请求完成之前通过第二个 ajax 请求,并尝试进入尚未创建的 div。
为了解决这个问题,我将第二个 ajax 请求放在第一个请求中,如下所示:
ajax请求{
造成dis
的代码
第二个ajax请求}
这似乎使数组中的元素以正确的顺序返回,但 div 没有正确显示来自 ajax 请求的数据。我注意到在记录 name
变量时,数组中只有一个元素似乎传递给了第二个 ajax 请求。
[控制台日志][1]
无论如何,我仍在学习如何排除故障,因此非常感谢任何提示。
[这是它应该的样子][2]
下面是 JS,这里是 link 代码笔,如果有帮助的话:https://codepen.io/mso122591/pen/jxNoBV
$(document).ready(function() {
var twichUrl = "https://wind-bow.glitch.me/twitch-api";
var channels = ["ESL_SC2", "freecodecamp", "OgamingSC2"];
var name = "";
var name2 = "";
var logo = "";
for (i = 0; i < channels.length; i++) {
twitchUrl =
"https://wind-bow.glitch.me/twitch-api/channels/" +
channels[i] +
"?callback=?";
twitchUrlStream =
"https://wind-bow.glitch.me/twitch-api/streams/" +
channels[i] +
"?callback=?";
$.ajax({
type: "GET",
url: twitchUrl,
dataType: "jsonp",
jsonp: "callback",
success: function(data) {
name = data.display_name;
logo = data.logo;
console.log('channel data below:')
console.log(name);
$("body").append(
"<div id=" +
name +
"Container>" +
' <span class ="icon" id =' +
name +
"><img src=" +
data.logo +
">" +
"</span>" +
'<span class = "status" id = "' +
name +
'data"></span>' +
"</div>"
);
$.ajax({
type: "GET",
url: twitchUrlStream,
dataType: "jsonp",
jsonp: "callback",
success: function(data) {
console.log('stream data below:')
console.log(name);
if (data.stream === null) {
$("#" + name + "data").html(
" " +
'<a target = "_blank" href ="https://www.twitch.tv/' +
name +
'">' +
name +
"</a>" +
" is currently offline"
);
} else {
$("#" + name + "data").html(
" " +
'<a target = "_blank" href ="https://www.twitch.tv/' +
data.stream.channel.display_name +
'">' +
data.stream.channel.display_name +
"</a>" +
" is Streaming: " +
data.stream.game +
"-- " +
data.stream.channel.status
);
}
}
});
}
});
}
});
解决这个问题的一种方法是使用 promises。我很快就用 $.when 向你承诺了 jquery,并修复了你的页面。
您的代码存在一些问题。有一个变量没有用 var 声明,所以它创建了一个全局变量,所以你总是只得到最新的 http get 值。
我已经使用 "let" 关键字来声明变量并将它们放在 for 循环中。这将创建一个局部变量,该变量仅在每个循环内有效且不会被覆盖。 for 循环用作计数器变量 "i",它也未声明,因此它也成为全局变量。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://api.jquery.com/jquery.when/
$.when(your ajax code)
https://codepen.io/anon/pen/Qrbzqx
这将创建一个对象,在一个对象中包含两个响应。您现在可以使用它来将您的 HTML 写入文档
注意 .then() 这些是在每次 http get
之后触发的
我试图通过两个不同的 ajax 调用将字符串放入数组中。然后使用字符串名称的 id 创建 div,并包含有关从 ajax 请求流式传输哪些 twitch 流媒体的数据。
问题是我正在努力使元素通过第一个 ajax 调用然后通过第二个调用,因为 ajax 调用是异步的。因此,数组中的元素将在第一个请求完成之前通过第二个 ajax 请求,并尝试进入尚未创建的 div。
为了解决这个问题,我将第二个 ajax 请求放在第一个请求中,如下所示:
ajax请求{
造成dis
的代码第二个ajax请求}
这似乎使数组中的元素以正确的顺序返回,但 div 没有正确显示来自 ajax 请求的数据。我注意到在记录 name
变量时,数组中只有一个元素似乎传递给了第二个 ajax 请求。
[控制台日志][1]
无论如何,我仍在学习如何排除故障,因此非常感谢任何提示。
[这是它应该的样子][2]
下面是 JS,这里是 link 代码笔,如果有帮助的话:https://codepen.io/mso122591/pen/jxNoBV
$(document).ready(function() {
var twichUrl = "https://wind-bow.glitch.me/twitch-api";
var channels = ["ESL_SC2", "freecodecamp", "OgamingSC2"];
var name = "";
var name2 = "";
var logo = "";
for (i = 0; i < channels.length; i++) {
twitchUrl =
"https://wind-bow.glitch.me/twitch-api/channels/" +
channels[i] +
"?callback=?";
twitchUrlStream =
"https://wind-bow.glitch.me/twitch-api/streams/" +
channels[i] +
"?callback=?";
$.ajax({
type: "GET",
url: twitchUrl,
dataType: "jsonp",
jsonp: "callback",
success: function(data) {
name = data.display_name;
logo = data.logo;
console.log('channel data below:')
console.log(name);
$("body").append(
"<div id=" +
name +
"Container>" +
' <span class ="icon" id =' +
name +
"><img src=" +
data.logo +
">" +
"</span>" +
'<span class = "status" id = "' +
name +
'data"></span>' +
"</div>"
);
$.ajax({
type: "GET",
url: twitchUrlStream,
dataType: "jsonp",
jsonp: "callback",
success: function(data) {
console.log('stream data below:')
console.log(name);
if (data.stream === null) {
$("#" + name + "data").html(
" " +
'<a target = "_blank" href ="https://www.twitch.tv/' +
name +
'">' +
name +
"</a>" +
" is currently offline"
);
} else {
$("#" + name + "data").html(
" " +
'<a target = "_blank" href ="https://www.twitch.tv/' +
data.stream.channel.display_name +
'">' +
data.stream.channel.display_name +
"</a>" +
" is Streaming: " +
data.stream.game +
"-- " +
data.stream.channel.status
);
}
}
});
}
});
}
});
解决这个问题的一种方法是使用 promises。我很快就用 $.when 向你承诺了 jquery,并修复了你的页面。
您的代码存在一些问题。有一个变量没有用 var 声明,所以它创建了一个全局变量,所以你总是只得到最新的 http get 值。
我已经使用 "let" 关键字来声明变量并将它们放在 for 循环中。这将创建一个局部变量,该变量仅在每个循环内有效且不会被覆盖。 for 循环用作计数器变量 "i",它也未声明,因此它也成为全局变量。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://api.jquery.com/jquery.when/
$.when(your ajax code)
https://codepen.io/anon/pen/Qrbzqx
这将创建一个对象,在一个对象中包含两个响应。您现在可以使用它来将您的 HTML 写入文档
注意 .then() 这些是在每次 http get
之后触发的