Node.js fs.WriteStream行为异常

Node.js fs.WriteStream行为异常,node.js,Node.js,我希望下面的代码打印出来 Finished writing GB translations Finished writing DE translations Finished writing US translations 但它却打印出来了 Finished writing DE translations Finished writing DE translations Finished writing DE translations 代码: 除此之外,尽管它似乎工作正常,但一切都按照预期写

我希望下面的代码打印出来

Finished writing GB translations
Finished writing DE translations
Finished writing US translations
但它却打印出来了

Finished writing DE translations
Finished writing DE translations
Finished writing DE translations
代码:

除此之外,尽管它似乎工作正常,但一切都按照预期写入了gb.json、de.json和us.json。这是为什么?

语言在for循环中每次都被覆盖,但是.on'finish'异步执行。所以language='DE'实际上首先发生,然后所有的'finish'事件发生,所以它将打印出设置为最后一个的任何'language'

有很多方法可以解决这个问题,但最简单/需要最少更改的方法是只使用let,如:

这将为循环的每个迭代定义语言的范围。

ah当然,经典的var错误,感谢您指出这一点
try {
    fs.mkdirSync('./locales');
} catch(e) {
    console.log('Info: Locales directory already exists');
}

jsonDefs = {
             GB: {"Item does not exist": "Item does not exist"},
             DE: {"Item does not exist": "Artikel existiert nicht"}, 
             US: {"Item does not exist": "Item does naaht exist"}
           };

for(language in jsonDefs){
    const fileName = `${language.toLowerCase()}.json`;
    const writeStream = fs.createWriteStream(`./locales/${fileName}`);
    writeStream.on('finish', function(){ console.log(`Finished writing ${language} translations`); });
    writeStream.on('error', function(err){
      console.log(`Error writing to ${fileName}: ${err}`);
    });
    writeStream.write(JSON.stringify(jsonDefs[language]), () => writeStream.end());
}
for (let language in jsonDefs) {