一尘不染

AJAX回调中变量的值错误

json

我有一些使用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);

 });

}

数据变量返回true或false。但是我无法从JSON返回的函数中获得正确的BTWnummer。它始终保留1个BTW号码。我认为JSON是异步的,那么如何在JSON代码中获取正确的数字?根据我的测试,它确实在callUrl中使用了不同的数字。


阅读 194

收藏
2020-07-27

共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关键字将定义范围为块的变量。

2020-07-27