0

JSON を使用して vat 番号をチェックするコードが少しあります。

どの VAT 番号が正しいかを知りたい

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);
 
 });
 
}

data 変数は true または false を返します。しかし、JSON から返される関数内で正しい BTWnummer を取得できません。常に 1 つの BTW 番号を保持します。JSON は非同期だと思いますが、JSON コードのビット内で正しい数値を取得するにはどうすればよいでしょうか? 私のテストによると、callUrl で異なる番号を使用しています。

4

1 に答える 1

5

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(「閉鎖」を探して、より深く掘り下げます)。

let近い将来、ES6 では、このトリックは、スコープがブロックである変数をキーワードが定義するようになるため、必要なくなります。

于 2013-11-12T09:19:53.607 に答える