无法获取我的变量以保持其值超出getJSON

时间:2012-06-19 00:01:10

标签: javascript jquery json

我这个代码有问题。我的问题是第一个console.log(smile_per_sec)给了我需要的值,但是第二个给了我当我声明变量时我给它的值。

  $.getJSON( 
    twitter_api_url + '?callback=?&rpp=100&q=text::)',
    function(data) {
      $.each(data.results, function(i, tweet) {
        //console.log(tweet);
        // Before we continue we check that we got data
        if(tweet.text !== undefined) {
        //here we save the time of our happy tweet
          var date_tweet = new Date(tweet.created_at);
          per_sec[i] = date_tweet/1000;
          //console.log(per_sec[i]);
        }
      });

      //here we calculate how manny happy tweets the world tweets per second
        smile_per_sec = 100/(per_sec[0]-per_sec[98])
        $('#tweet_container').append(smile_per_sec + "<br>");   
          console.log(smile_per_sec);
          return smile_per_sec;
    }
  );
console.log(smile_per_sec);

这可能是一个简单的解决办法,但是你的帮助会非常感激。

1 个答案:

答案 0 :(得分:1)

我假设你想在下面我记下的两个地方进行比较:

$.getJSON( 
  twitter_api_url + '?callback=?&rpp=100&q=text::)',
  function(data) {
    $.each(data.results, function(i, tweet) {
      //console.log(tweet);
      // Before we continue we check that we got data
      if(tweet.text !== undefined) {
        //here we save the time of our happy tweet
        var date_tweet = new Date(tweet.created_at);
        per_sec[i] = date_tweet/1000;
        //console.log(per_sec[i]);
      }
    });
    //here we calculate how manny happy tweets the world tweets per second
    smile_per_sec = 100/(per_sec[0]-per_sec[98])
    $('#tweet_container').append(smile_per_sec + "<br>");   
    ///////////////////////////////////////////////
    //  this is place one
    ///////////////////////////////////////////////
    console.log(smile_per_sec);
    return smile_per_sec;
  }
);
///////////////////////////////////////////////
// this is place two
///////////////////////////////////////////////
console.log(smile_per_sec);

立即放置两个执行,一个等待直到getJSON发生。这称为异步编程。在得到它之前你不能使用它,如果你想要“等待另一件事完成”,你需要采用flexibile异步编程技术。

任何时候人们谈论javascript中的事件或回调,这就是他们所说的。在这种情况下,您的回调会在第三行开始function(data)

我觉得有必要详细说明,让我这样做:

$.getJSON( ... );
console.log(smile_per_sec);

这两个有效地“同时”运作。在getJSON中发生的事情会被困在backburner上,直到它完成,让你的页面继续做的事情。所以控制台.log只是继续前进并弹出,但后面的燃烧器没有回到前面,水还没沸腾。因此,直到水沸腾(可能是10毫秒,可能是3分钟),你不能用水,水面条或其他任何东西做任何事情。

我意识到这一开始很难掌握,但是一旦你得到这个,你就会得到这整个ajax的东西。

要回答“如何在完成后完成所有工作”的问题,答案是重构您的代码,如下所示:

// Here we've made this a named function, and allowed the function to be more neatly encapsulated
function twitterCallback(data) {
  $.each(data.results, function(i, tweet) {
    //console.log(tweet);
    // Before we continue we check that we got data
    if(tweet.text !== undefined) {
      //here we save the time of our happy tweet
      var date_tweet = new Date(tweet.created_at);
      per_sec[i] = date_tweet/1000;
      //console.log(per_sec[i]);
    }
  });
  //here we calculate how manny happy tweets the world tweets per second
  smile_per_sec = 100/(per_sec[0]-per_sec[98])
  $('#tweet_container').append(smile_per_sec + "<br>");   

  console.log(smile_per_sec);
  return smile_per_sec;

  ///////////////////////////////////////////////
  //  this is where you put stuff that has to wait on twitter to return
  ///////////////////////////////////////////////

}

$.getJSON( 
  twitter_api_url + '?callback=?&rpp=100&q=text::)',
  twitterCallback
);