函数中的变量不更新全局

时间:2014-01-09 23:06:29

标签: javascript

我正在尝试从我得到的响应中更新全局变量。我知道我的范围在某种程度上搞砸了,我试图找到一个例子,但找不到与之匹配的例子。我是javascript的新手,所以任何语法提示都会有所帮助。任何帮助都会很棒!

    hit_count: function(permalink) {

    var count = 0,
    perm = permalink,
    url;

    if(perm) {
        url = 'http://www.mysite.com?q=scope:' + perm + '&callback=?';

        $.getJSON(url, function(result){
           count = result.count;
           //want this to update global count or at least return this count
           if(count > 1) {
               count = count - 1;
           }

        });
    }

    return count;
}

2 个答案:

答案 0 :(得分:1)

问题是$.getJSON 异步。在此代码中,

$.getJSON(url, function(result){
  //...
  count = count - 1;
});
return count;

在JSON请求完成之前执行语句return count;。这意味着,count = count - 1行将在count返回后很长时间执行。

处理此问题的典型方法是传递回调函数以在请求完成时执行。在您的示例中,您可以执行此操作。

hit_count: function(permalink, callback) {
  //...
  $.getJSON(url, function(result){
    //...
    count = count - 1;
    callback(count);
  });
}

然后你可以这样打电话:

hit_count(permalink, function(count) {
  // code to execute once the request is complete
});

答案 1 :(得分:0)

麻烦的是,在Ajax请求完成之前,你无法获得count的更新值,隐藏在getJSON后面的处理程序实际上会调用你的处理程序。

这就像假设一封信的收件人在您将其放入邮箱后立即读取它一样。

您可能想要计算两件事:

1)发送的信件数量 2)阅读它们的人的致谢数量。

由于这些字母需要时间旅行(请求从浏览器来回转发到服务器)并且信件甚至可能丢失(Ajax请求可能会失败),因此您无法假设两个计数始终相等。

这里你的处理程序代码试图计算安全到达家中的字母,而hit_count处理与发送的字母数相同的计数器。

这只能以泪水结束:)