const for for for循环,为什么会出现这种行为?

时间:2016-04-08 15:17:31

标签: node.js ecmascript-6

我的nodejs代码中有一个for循环

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 ...映射到node src/main/myApp.js

中的package.json即可

我可能在这里遗漏了一些简单的东西,但在做客户端ES6代码之前我从未见过这个。当然,最大的区别是客户端代码通过Babel + Webpack,服务器端代码直接通过节点运行。

小附录:如果你想知道为什么“旧学校”的语法而不是pages.forEach(....的内容,那是因为这是现有的代码,我只做了一些小修改。

1 个答案:

答案 0 :(得分:2)

这将按照您在严格模式下的预期工作。尝试添加...

"use strict";

您只会在实际尊重和强制执行关键字的环境(如Node)中看到此行为。 Babel现在只需将所有letconst转换为var即可提供ES5兼容性。为了演示,请看一下这个巴别塔example。您可以在输出中看到const已更改为var