首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时Ajax调用JS返回数据不相关

同时Ajax调用JS返回数据不相关
EN

Stack Overflow用户
提问于 2018-04-20 22:22:37
回答 1查看 75关注 0票数 0

我试图通过两个不同的ajax调用将字符串放入数组中。然后用名为string的ids创建Divs,并包含来自ajax请求的哪些twitch流的数据。

问题是,由于ajax调用是异步的,所以我很难这样做,以便元素通过第一个ajax调用,然后再进行第二个ajax调用。因此,数组中的元素将在第一个ajax请求完成之前通过第二个ajax请求,并尝试进入尚未创建的div。

为了解决这个问题,我将第二个ajax请求放在第一个ajax请求中,如下所示:

ajax请求{

生成dis的代码

第二个ajax请求}

这似乎使数组中的元素以正确的顺序返回,但是div没有正确地显示来自ajax请求的数据。我注意到,在记录name变量时,数组中似乎只有一个元素被传递到第二个ajax请求。

控制台日志

无论如何,我仍然在学习如何排除故障,所以任何提示都将不胜感激。

这就是它应该看起来的样子

下面是JS,这里有一个指向代码页的链接(如果有帮助的话):https://codepen.io/mso122591/pen/jxNoBV

代码语言:javascript
复制
$(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
              );
            }
          }
        });
      }
    });
  }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-20 22:44:46

解决这一问题的方法之一是承诺。我已经用$.when快速地改进了您的jquery,并修复了您的页面。

您的代码有一些问题。有一个变量没有用var声明,所以它创建了一个全局变量,所以您总是只得到最新的http值。

我使用了"let“关键字来声明变量,并将它们放入for循环中。这将创建一个局部变量,该变量仅在每个循环中有效,且未被写入。for循环使用反变量"i“,该变量也没有声明,因此这也成为一个全局变量。

Objects/Promise

https://api.jquery.com/jquery.when/

代码语言:javascript
复制
$.when(your ajax code)

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

这将在一个对象中创建一个具有两个响应的对象。现在可以使用它将HTML写入文档

注意,.then()是在每个http之后触发的

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

https://stackoverflow.com/questions/49950454

复制
相关文章

相似问题

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