2017-04-12 38 views
0

我有一個電子應用程序,並在其中寫入一個文件。NodeJS - 寫入文件有時會結束

if(fs.existsSync(envFilepath)) { 
    envFile = fs.createWriteStream(envFilepath) 

    var envs = document.getElementById("envs").value.split(",") 
    envs.forEach(function(env) { 
     if(env && env.localeCompare(" ") !== 0) { 
      env = env.trim() 
      envFile.write(env + '\n') 
     } 
    }) 

    envFile.end() 

    envFile.on('finish', function syncConfigs() { 
     //perform additional tasks 
    }) 
} 

有時,陣列envs具有元件,它會返回。對於那些時刻,end()被調用,並且finish事件被捕獲並且我順利地滾動。但是,有時,envs可能是空的,我不寫入文件。 NodeJS似乎掛起,因爲我沒有呼叫write()finish事件永遠不會被調用。

這是怎麼發生的?有這種情況的解決方法嗎?

+0

在同一代碼體中,你是如何混合使用node.js'fs'代碼和瀏覽器'DOM'函數(如'document.getElementById()')的? – jfriend00

+0

@ jfriend00我正在使用Electron。 – akcorp2003

回答

2

如果您使用fs.createWriteStream(),您應該聽取'close'事件而不是'finish'事件。

envFile.on('close',() => { 
    // handle done writing 
}) 
1

如果您沒有任何信息,您可以通過不打開文件來解決問題。而且,如果您只是收集所有要寫入的數據,那麼一次寫入所有數據效率更高,並且事先知道如果您確實有任何要寫入的內容會更加高效,因此如果沒有什麼可寫的話,甚至可以避免打開文件:

if(fs.existsSync(envFilepath)) { 

    function additionalTasks() { 
     // perform additional tasks after data is written 
    } 

    // get data to be written 
    let envs = document.getElementById("envs").value.split(","); 
    let data = envs.map(function(env) { 
     if(env && env.localeCompare(" ") !== 0) { 
      return env.trim() + '\n'; 
     } else { 
      return ""; 
     } 

    }).join(""); 
    // if there is data to be written, write it 
    if (data.length) { 
     fs.writeFile(envFilePath, data, function(err) { 
      if (err) { 
       // deal with errors here 
      } else { 
       additionalTasks(); 
      } 
     }); 
    } else { 
     // there was no file to write so just go right to the additional tasks 
     // but do this asynchronously so it is consistently done asynchronously 
     process.nextTick(additionalTasks); 
    } 
} 
+0

感謝您指出這一點!我忘記了查詢我返回的數組的長度。但這個答案絕對是另一種解決方案! – akcorp2003

+0

@ akcorp2003 - 我認爲這在技術上是一個更有效的解決方案,因爲它收集所有要寫入的數據,如果有什麼需要寫入的時候測試一次,然後一次寫入。它甚至可以避免打開文件,如果沒有什麼可寫的。即使沒有任何可寫的內容,您目前的方法也會打開並關閉文件,然後在需要寫入內容的情況下一次寫出小塊文件。 – jfriend00