2016-11-29 14 views
0

私は小さな電子アプリケーションを構築しようとしています。それは、ユーザーからファイル/ファイルを取得し、特定のフォルダにコピーし、そのファイルに関するすべての情報をデータベースに追加します。変数は私のループ内部の関数内で間違った値を与えます

const fs = require('fs-extra') 
//sample 2 file entry 
files = {"0":{"name":"File1.png","path":"A:\\User Folders\\Desktop\\File1.png"},"1":{"name":"File2.jpg","path":"A:\\User Folders\\Desktop\\File2.jpg"},"length":2} 
window.$ = window.jQuery = require('jquery'); 

jQuery.each(files, function(file) { 
    //this is just one of many variables I need 
    currentfile = files[file].path 
    fs.copy(currentfile, "./files/"+"."+files[file].name, function (err) { 
     if (err) { 
      console.log(err) 
     } else { 
      console.log(currentfile); 
      //I expect this to log file1 then file2 so I can submit it to my database, 
      //but it always logs file2 

     } 
    }) 
}); 

それは、一度に1つのファイルのため正常に動作しますが、私は複数を処理しようとしたとき、私はそれが(ファイルをコピーする期待通りに動作しない、DOMを更新し、次のファイルをコピーし、DOMを更新、など)。

答えて

1

おそらくローカルにしたいときに、グローバルスコープの変数を誤って宣言したと思います。

変更この:これに

currentfile = files[file].path 

var currentfile = files[file].path 

これがエラーを処理する匿名関数は、その匿名関数でcurrentfile変数にアクセスすることができるようになりますclosureを形成することになりますjquery eachを処理します。

+2

* "これはクロージャを形成します..." *これはクロージャを形成しません。グローバル環境ではなく現在のレキシカル環境で変数を宣言します。 functionステートメントは、字句環境または「クロージャ」を作成するものです。また、w3schoolsが最良の参考資料ではないかもしれません。 –

+0

ありがとう、私は違いがあったことを知らなかった(まだここにnoob)。私はそれがグローバル変数を作成していたにもかかわらず、それがうまくいかなかったにもかかわらず、私が得ないものはあります。私は、各ファイルについて変数をその現在のファイルに変更し、それを使ってファイルを作成し、次のファイルに書き込んだり、再度変更したりすると仮定します。私はそれを試して理解するためにvs vs notを使って読んでいますが、事態がどのように悪くなっているかを説明できれば非常に役に立ちます。 –

+0

これは非同期です。エラーハンドラが呼び出されるまでに 'each'ループが他のレコードに移動し、エラーハンドラが期待していない方法で' currentFile'変数を更新している可能性があります。 –

関連する問題