2014-01-09 47 views
0

我正在尝试更新我得到的响应中的全局变量。我知道我的范围被搞乱了,我试着找到一个例子,但是找不到与之匹配的例子。我是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; 
} 
+0

这不工作? – Cilan

+5

'$ .getJSON'是异步的,所以这不起作用。当你执行'return count'时,'$ .getJSON'可能还没有完成。你能告诉我们你是如何使用这个功能的吗? – putvande

+0

@putvande我字面上只是从另一个函数调用它为count = parseInt(trend_count(params.permalink),5); – atsituab

回答

1

的问题是,$.getJSON是异步。在这段代码中,

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

声明return count;的JSON请求完成之前执行。这意味着行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 
}); 
+0

那么我该如何解决这个问题? – atsituab

+0

@atsituab请参阅编辑 –

+0

你先生很棒谢谢:) – atsituab

0

麻烦的是,Ajax请求是完整的,背后隐藏着getJSON处理程序实际上是调用您的处理程序之前,你不能计数的更新值。

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

您可能要算两个不同的东西:

1)的字母数发送
2)确认的数量从谁读不懂他们的人。由于信件需要时间旅行(请求从浏览器到服务器来回传输),甚至可能丢失一封信件(Ajax请求可能失败),所以您不能假设两个计数总是相等的。

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

这只能流泪:)