我假设您想在我在下面注明的两个地方进行比较:
$.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 发生。这称为异步编程。在你得到它之前你不能使用这个值,如果你想要一些东西“等待另一件事完成”,你需要采用灵活的异步编程技术。
任何时候人们谈论 javascript 中的事件或回调,这就是他们在谈论的内容。在这种情况下,您的回调从function(data)
第三行开始。
我觉得有必要详细说明,让我这样做:
$.getJSON( ... );
console.log(smile_per_sec);
这两者有效地“同时”运作。getJSON 中发生的事情在完成之前一直被搁置,让您的页面继续做事。所以console.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
);