我的一个JavaScript变量似乎在jQuery调用后被重置
我的代码向Twitter发送搜索数据请求,并以JSON格式获取响应。获取JSON后,它将符合特定条件的响应计数存储在数组中 下面是调用查询Twitter的函数的代码我的一个JavaScript变量似乎在jQuery调用后被重置,javascript,jquery,json,Javascript,Jquery,Json,我的代码向Twitter发送搜索数据请求,并以JSON格式获取响应。获取JSON后,它将符合特定条件的响应计数存储在数组中 下面是调用查询Twitter的函数的代码 $(document).ready(function() { ... graph = new HighCharts.chart({ chart: { events: { load: function() { console.log("events.loa
$(document).ready(function() {
...
graph = new HighCharts.chart({
chart: {
events: {
load: function() {
console.log("events.load");
var that = this;
var update = function() {
if (polling) {
console.log("update()");
// The least index series will be nearest the x-axis
var stackNumber = 0;
var numTweets = updateValues();
console.log(numTweets + "");
for (var i = 0, currentSeries = that.series; i < currentSeries.length; i++) {
var x = (new Date()).getTime(), // current time
y = numTweets[i];
stackNumber += y;
currentSeries[i].addPoint([x, y], true, true);
}
}
}
// set up the updating of the chart each second
var series = this.series[0];
setInterval(update, 1000);
}
}
发生的情况是,变量voteCount
在jQuery调用中正确递增。然而,在呼叫之外,它正在被重置。因此,日志输出如下所示:
updateValues() -> getJSON -> each -> voteCount = [1,0,0,0]
updateValues() -> getJSON -> voteCount = [1,0,0,0]
updateValues() -> voteCount = [0,0,0,0]
这个问题是否与jQuery的异步调用有关,并且我遇到了有趣的变量修改冲突?还是其他原因?在JavaScript中使用异步回调时,它们会稍后执行。。。异步的。因此,如果你有:
var x = 5;
console.log("before getJSON", 5);
$.getJSON("/some/url", function (json) {
x = 10;
console.log("inside callback", x);
});
console.log("after getJSON", x);
输出将是
before getJSON 5
after getJSON 5
inside callback 10
在请求返回后要执行的任何代码都必须在回调内部;将其物理地放在$调用之后。getJSON
调用将不够。您应该将$.getJSON
看作是“启动”JSON获取过程,然后立即返回给您;直到稍后,当您的脚本执行完正常代码并且服务器已经响应时,JavaScript事件循环才会说“嘿,我得到了响应,我空闲了;是时候调用等待响应的回调了!”
因此,您的
updateValues
函数需要接受自己的回调,以便通知自己的调用者值已更新;仅仅调用updateValues
只会启动值更新过程,并且在空闲时间之前不会更新值。比如:
function updateValues(onUpdated) {
var url = "http://search.twitter.com/search.json?callback=?&q=";
var cls = "Penn_CIS240"
var query = "%23" + cls;
var voteCount = [0,0,0,0];
$.getJSON(url + query, function (json) {
// use of json to update voteCount ellided
onUpdated(voteCount);
});
}
然后调用代码将其用作
updateValues(function (voteCount) {
// use the updated vote counts inside here.
});
@基本上是巨型棉花糖,加上你的
返回voteCount
在getJson块内(第二个console.log所在的位置)@roselan您不能从回调函数内返回外部函数的值。@Domenic:这非常有用。谢谢真的!然而,您的解决方案似乎很奇怪,因为结果用于构建图形。它能用这个回调刷新吗?就个人而言,我会为voteCount使用一个全局变量,用updateValues(在graph builder函数外部调用)设置它,并让它在setInterval内刷新它。(此外,还可以在.success函数中设置另一个全局变量“time”(getTime()),以保持一致性)@roselan:您可以在回调中执行任何操作,包括刷新。您的解决方案使用了两种最糟糕的做法(全局变量,setInterval
polling),并且不会像标准方法(由所有库使用,正如jQuery的$.getJSON
所示)那样快速或响应,因为它轮询而不是响应回调。例如,如果您使用与发送$.getJSON
请求相同的setInterval
进行更新,正如您所建议的那样,将会有额外的1秒延迟。
updateValues(function (voteCount) {
// use the updated vote counts inside here.
});