2016-04-08 8 views
2

私は理解していない私のnodejsコードforループ内のconst使用法、なぜこの動作ですか?

const saveDocument = co.wrap(function *(documentData, user, locale) { 
    var now = moment(); 
    var creationDateLongString = now.format("YYYYMMDDHHmmss"); 
    var creationDateShortString = now.format("YYYYMMDD"); 

    var outputChildFolder = documentData.code + '_' + creationDateLongString + '_' + documentCounter; 
    var outputFolder = config.files.incomingDocumentsDir + '/' + outputChildFolder; 

    ++documentCounter; 
    yield fs.mkdir(outputFolder) 

    var xmlFileName = documentData.code + "-" + creationDateLongString + ".xml"; 
    var pdfFileName = documentData.code + "-" + creationDateLongString + ".pdf"; 

    const pages = []; 

    for(var index=0;index < documentData.pages.length; ++index) { 
     const page = documentData.pages[index]; 
     var data = new Buffer(page, "base64"); 
     var dataEncoding = imageType(data).mime === "image/png" ? "png" : "jpg"; 
     var fileName = "page" + index + "." + dataEncoding; 
     var targetFilePath = outputFolder + "/" + fileName 
     yield fs.writeFile(targetFilePath,data); 
     pages.push(fileName); 
    } 
... 
} 

のループのためのものを持っているが、上記のコードでpageは一度だけ割り当てられますなぜ最初の反復で、あり、そして他の反復中に同じ値を保持します。したがって、5ページある場合、その変数の最初のページのデータで5回終了します。

ノード4を特別な引数やポストプロセッサなしで実行しています。単にnpm run ...私はおそらくここに単純なものをしないのですが、私はクライアント側のES6コードを実行するときに前にこれを見たことがない私のpackage.json

node src/main/myApp.jsにマップします。大きな違いは、クライアント側のコードがBabel + Webpackを通過し、サーバー側のコードがノードを介して直接実行されていることです。

小さな補遺:理由が「旧式の学校」という理由で、pages.forEach(....の行に沿ったものではなく、それが何か小さな変更を加えた既存のコードであるためです。

+0

私は同じ結果を得ていません。あなたのコードの詳細を表示してください。 (また... 'var' - >' let') –

+0

var - > let stuffについても知っています。したがって、最後の段落で私の発言。ファイル全体をリファクタリングするつもりはありませんでした。 –

答えて

2

これは厳密なモードで期待されるように機能します。追加してみてください...

"use strict"; 

この動作は、実際にキーワードを尊重して強制する環境(Nodeなど)でのみ表示されます。 Babelはletconstvarに変換するだけで、ES5の互換性を提供します。実証するために、このBabel exampleを見てください。出力でconstvarに変更されました

+0

ありがとう!ちょうど不思議なことに、なぜforループで宣言が2回目に発生したときに、そのコードを実行するとエラーになるのですか? –

+0

だから私はそれを見つけようとしていて、それが厳格なモードで動作することに気付いた。私は回答者を編集しました。私はconstがブロックのようにスコープされているので、これは技術的には再宣言ではないと信じています。ある時点では、letとconstを厳密なモード以外で使用しようとしたときにノードが投げられていましたが、現在は静かで、この場合のように不思議に動作しています。 –

+2

ループが新しい反復に入ると、constはブロックスコープですスコープを再入力するので、再宣言できます。 –

関連する問題