2017-05-30 19 views
1

javascriptを初めて使用しています。ここに私のコード変更可能な変数はクロージャからアクセス可能です

...... 
var filename, result, user=["a", "b", "c","d"]; 
for(var p=0;p<user.length;p++) 
     { 
     filename=userID[p]+'_'+user[p]+'.json'; 

     fs.readFile(filename, function read(err, data) 
     { 
      if (err) {throw err;} 
      result = data.toString(); 

      if (result.charAt(result.length-1) === ',') 
      result = result.substring(0,result.length-1) + ']}'; 

      console.log(p+filename+result+"\n\n"); //here 

      }); 

     } 

は、pの値は、常にすべての反復のためにも、ファイル名はiteration.Howは、私が正しい得ることができるための最後では、このケース3には、最後のインデックスを示している「ここ」であります「ここ」のpの値。私のコンパイラは、「可変変数はクロージャからアクセス可能です」と示しています。

+3

に従ってください。 'var'の代わりに[let binding](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let)(つまり' let p = 0')を使用してください。あるいは 'user.forEach'を使うこともできます – naomik

答えて

1

@naomikのコメントは正しく表示されますループの本体内の非同期ジョブは常に悪い考えです。ループは応答まで待機しないためです。

var filename, result, user=["a", "b", "c","d"]; 
var p=0; 
function readfileUnitil(p) 
    { 
    filename=userID[p]+'_'+user[p]+'.json'; 

    fs.readFile(filename,function(err, data) 
    { 
     if (err) {throw err;} 
     result = data.toString(); 

     if (result.charAt(result.length-1) === ',') 
     result = result.substring(0,result.length-1) + ']}'; 

     console.log(p+filename+result+"\n\n"); //here 
     if(p<user.length){ 
     p++; 
     readfileUnitil(p); 
     } 
     }); 
    } 
} 

私はこの変数をlet変数の代わりに使用することをお勧めします。これは、読みやすく、メモリがブラウザの希望によって保持されないためです。

1

この場合、filenameの範囲はfor loopブロック、filename値はfs.readFileに結合しています。 readFile`が非同期であると `read`が呼び出された時点で、` p`は既に `3`にインクリメントしている`ので、この問題を解決する簡単な方法は、それが起こっているブロックコード

var filename, result, user = ["a", "b", "c", "d"]; 
for (var p = 0; p < user.length; p++) { 
    filename = userID[p] + '_' + user[p] + '.json'; 

    (function(file) { 
     fs.readFile(filename, function read(err, data) { 
      if (err) { 
       throw err; 
      } 
      result = data.toString(); 

      if (result.charAt(result.length - 1) === ',') 
       result = result.substring(0, result.length - 1) + ']}'; 

      console.log(p + filename + result + "\n\n"); //here 

     }); 

    })(filename) 

} 
関連する問題