Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的一个JavaScript变量似乎在jQuery调用后被重置_Javascript_Jquery_Json - Fatal编程技术网

我的一个JavaScript变量似乎在jQuery调用后被重置

我的一个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

我的代码向Twitter发送搜索数据请求,并以JSON格式获取响应。获取JSON后,它将符合特定条件的响应计数存储在数组中

下面是调用查询Twitter的函数的代码

$(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.
});