jQuery范围 - 为什么我的数组不会被填充?

时间:2017-01-29 00:01:56

标签: jquery arrays

我有一个JSON文件,其中包含一组推文的信息,我正在尝试使用每条推文的原始文本填充数组。集合中有95条推文,因此数组中应该包含95个项目(每个项目都是一个包含推文原始文本的字符串)。

这是我的代码:

getWod(): void {
    let id;
    this.route.params.forEach((params: Params) => {
      id = +params['id'];
    })
    this.wodService.getWod(id).then(function(data){
        this.wod = data;
    }); 
  }

当我运行此代码时,我在控制台中获得此输出:

// Declaring array to hold tweets
allTweets = new Array();

$(document).ready(function() {
  // Going through JSON file to get raw text from tweets
  $.getJSON("TwitterTweets17.json", function(data) {
    $.each(data, function(key, val) {
      $.each(val, function(key2, val2) {
          // Only getting raw text from tweets, no other info
          if (key2 === "text") {
            allTweets.push(val2);
          }
      });
    });
  });

  console.log("allTweets length: " + allTweets.length);

  for (i = 0; i < allTweets.length; i++) {
      console.log(allTweets[i]);
  }
})

这对我来说没什么意义。我尽可能地将 allTweets 数组声明为全局,但它似乎仍然没有填充数组。在$(document).ready函数之外移动console.log和for循环不会改变输出。为什么会这样?

提前致谢。

编辑:为了更全面地解决这个问题,这里是 提供我想要的输出的替代代码:

allTweets length: 0

这是近似的控制台输出:

// Declaring array to hold tweets
allTweets = new Array();

$(document).ready(function() {
  // Going through JSON file to get raw text from tweets
  $.getJSON("TwitterTweets17.json", function(data) {
    $.each(data, function(key, val) {
      $.each(val, function(key2, val2) {
        // Only getting raw text from tweets, no other info
        if (key2 === "text") {
          allTweets.push(val2);
        }
      });
    });

    console.log("allTweets length: " + allTweets.length);

    for (i = 0; i < allTweets.length; i++) {
      console.log(allTweets[i]);
    }
  });
})

等等。基本上它显示了所有的推文。所以我想我的问题是,为什么它在这种情况下起作用而不是之前的?

1 个答案:

答案 0 :(得分:0)

因为getJSON是ajax调用,而它的同步XMLHttpRequest你可以把它关闭async:false把它放在代码上面。

$.ajaxSetup({
  async: false
});

顺便说一下,它将全局异步所有的ajax调用。您可以使用$.ajax代替async:false此调用只是这样。

$.ajax({
    type:'GET',
    url:'TwitterTweets17.json',
    dataType:'json',
    async:false,
    success:function(data){
        $.each(data, function(key, val) {
          $.each(val, function(key2, val2) {
              // Only getting raw text from tweets, no other info
              if (key2 === "text") {
                allTweets.push(val2);
              }
          });
        });
    }
});