【问题标题】:Wrong value of variable in AJAX callbackAJAX 回调中的变量值错误
【发布时间】:2015-03-19 22:54:45
【问题描述】:

我有一段代码使用 JSON 来检查增值税号。

我需要知道哪些增值税号是正确的

BTW[0] = 'NL1234567890';
BTW[1] = 'NL1233537891';
BTW[2] = 'NL1232346894';

var arraylength = BTW.length;

for (var i = 0; i < arraylength; i++) {
  
 var BTWnummer = BTW[i];
 
 callUrl = 'http://isvat.appspot.com/'+Land+'/'+BTWnummer+'/?callback=?';
 
 $.getJSON(callUrl, BTWnummer, function(data){
 alert(data+' '+BTWnummer);
 
 });
 
}

数据变量返回真或假。但我无法在从 JSON 返回的函数中获得正确的 BTWnummer。它始终保留 1 个 BTW 编号。我认为 JSON 是异步的,那么我怎样才能在 JSON 代码中得到正确的数字呢?根据我的测试,它确实在 callUrl 中使用了不同的数字。

【问题讨论】:

  • 国家代码,它包含在下拉列表的变量中。在这种情况下 NL(不是每个增值税号都以国家代码开头,或者用户忘记添加)。
  • 你应该在callUrl前面加上var

标签: javascript json


【解决方案1】:

问题是在调用回调时变量BTWnummer发生了变化,因为循环在异步回调之前完全执行。

您可以将其值保存在立即调用的函数中:

for (var i = 0; i < arraylength; i++) {
   (function(BTWnummer){
      var callUrl = 'http://isvat.appspot.com/'+Land+'/'+BTWnummer+'/?callback=?';
      $.getJSON(callUrl, BTWnummer, function(data){
         alert(data+' '+BTWnummer);
      });
   })(BTW[i]);
}

如果难以阅读,这是另一种将其与命名函数(而不是匿名函数)一起使用的方法:

function f(BTWnummer){
  var callUrl = 'http://isvat.appspot.com/'+Land+'/'+BTWnummer+'/?callback=?';
  $.getJSON(callUrl, BTWnummer, function(data){
     alert(data+' '+BTWnummer);
  });
}
for (var i = 0; i < arraylength; i++) {
    f(BTW[i]);
}

这是因为 JavaScript 中变量的作用域是函数执行。 f 的不同执行存储 BTWnummer 的不同值(寻找“闭包”更深入)。

在不久的将来,ES6 将不再需要这个技巧,因为 let 关键字将定义范围为块的变量。

【讨论】:

  • 谢谢,这似乎有效!你能解释一下最新的位(BTW [i]);作品?它在函数之外,但仍然有效?
  • 啊,是的!我现在知道你可以用这样的参数编写未命名的函数。
  • 嗯,不知何故,它现在总是返回 true。它似乎确实工作了一秒钟。没改代码。但我认为问题在于我调用的 URL。
  • “返回”为真是什么意思?它在哪里返回一些东西?
  • isvat.appspot.com 数据变量返回真或假。现在,即使我输入了错误的增值税号,它也总是返回 true。我目前正在测试导致这种情况的原因。试图制作一个 jsfiddle,但它似乎已经失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多