2016-04-08 6 views
2

Ich habe eine for-Schleife in meinem NodeJS Codeconst Verwendung innerhalb for Schleife, warum dieses Verhalten?

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

Was ich nicht verstehe ist, warum in dem obigen Code page wird nur einmal vergeben, auf der ersten Iteration und hält diesen gleichen Wert während der anderen Iterationen . Wenn ich also 5 Seiten habe, lande ich 5 mal mit den Daten der ersten Seite in dieser Variable.

Ich führe Knoten 4 ohne spezielle Argumente oder Postprozessor. Einfach npm run ..., die auf eine node src/main/myApp.js in meinem package.json

Ich vermisse wahrscheinlich etwas einfach hier, aber ich habe noch nie zuvor gesehen, wenn Client ES6-Code zu tun. Der große Unterschied besteht natürlich darin, dass der clientseitige Code durch Babel + Webpack läuft und der serverseitige Code direkt durch den Knoten läuft.

Kleines Addendum: Wenn Sie sich fragen, warum die "alte Schule" für Syntax und nicht etwas in Richtung pages.forEach(...., ist es, weil dies bestehenden Code ist, wo ich nur ein paar kleinere Änderungen vorgenommen habe.

+0

Ich bekomme nicht das gleiche Ergebnis. Zeigen Sie mehr von Ihrem Code bitte. (auch ... 'var' ->' let') –

+0

Ich weiß über die var -> lass Sachen auch. Daher meine Bemerkung im letzten Absatz. Ich wollte die gesamte Datei nicht umgestalten. –

Antwort

2

Dies funktioniert wie erwartet im strikten Modus. Versuchen Sie, ...

"use strict"; 

Sie dieses Verhalten nur in Umgebungen sehen (wie Node), die tatsächlich respektieren und das Stichwort erzwingen. Babel konvertiert einfach alle let und const zu var jetzt, um ES5 Kompatibilität zu bieten. Um zu demonstrieren, werfen Sie einen Blick auf dieses Babel example. Sie können in der Ausgabe sehen, dass const wurde geändert in var

+0

Vielen Dank! Ich frage mich nur, warum wird beim Ausführen des Codes kein Fehler ausgegeben, wenn er in der for-Schleife zum zweiten Mal auf die Deklaration stößt? –

+0

Also versuchte ich herauszufinden und erkannte, dass es im strikten Modus funktioniert. Ich habe meinen answeer bearbeitet. Ich glaube, das ist technisch gesehen keine Redewendung, denn const ist blockhaft wie lassen. Irgendwann warf der Knoten, wenn Sie versucht haben, let und const außerhalb des strikten Modus zu verwenden, aber jetzt scheint es still zu sein und verhält sich seltsamerweise in diesem Fall –

+2

"const" ist Block-Bereich, sobald die Schleife eine neue Iteration eintritt Es wird erneut in den Gültigkeitsbereich des Programms aufgenommen, sodass Sie es erneut deklarieren können. –

Verwandte Themen