2015-05-18 28 views
2

我正在寫一個小文本文件(〜500B),但奇怪的是,如果我使用fs.writeFile之類的異步方法編寫一個空文件, ..)(或WriteableStream的寫入/結束方法)。fs.writeFile回調永遠不會被調用,對於WritableStream.write等是相同的

這工作:

var scanInfo = getScanInfo(core); // returns several lines delimited by \r\n 
fs.writeFileSync(filename, scanInfo, 'ascii'); 

這將創建空文件和回調函數不產生任何輸出:

var scanInfo = getScanInfo(core); 
scanInfo.push('') ; 
scanInfo = scanInfo.join(DOS_CRLF); 
fs.writeFile(filename, scanInfo, 'ascii', function (err) { 
    if(err) { console.error('Failed'); console.error(err) ; } 
    else { console.log('OK'); } 
}); 

我一直在尋找類似的職位,但在一個我發現這個問題是什麼else(調用另一個函數返回內容),但我的內容是一個文本字符串(通過調試驗證)。

類似的交:fs.writeFile() doesn't return callback

平臺> Win8.1 64

的NodeJS> 64 0.12.0

P.S.使用函數實際編寫文件的應用程序使用回調函數以「plain nodejs」樣式編寫,但由於它變得更加複雜,我使用Q和Q-IO重寫了主要處理流。 所以現在開始處理是這樣的:

(主模塊)

的一點是,主流在故障功能永遠不會報告任何問題,無論是。函數reportFinished()報告一切正常,並且沒有地方拋出任何異常,因爲上面的原始代碼片段(位於另一個模塊中並作爲writeMyOutputData(core)一部分調用的函數)永遠不會調用回調函數,因此它不可能執行任何異常拋出或任何類型的錯誤處理。

然而,閱讀約瑟夫的意見,這爲他工作後,我懷疑有可能是標準的FS模塊和Q-IO/FS

+0

你關閉文件? – jfriend00

+0

什麼是'DOS_CRLF',只是一個字符串'\ r \ n'?如果我在節點中模擬你的代碼,它似乎工作得很好。我可以問你的文件名是什麼嗎?同樣重要的是,我們在談論什麼平臺? Linux,Mac或Windows? –

+0

什麼節點版本和什麼操作系統? – mscdex

回答

5

OK之間的一些干擾,確定後仔細deugging問題。正如約瑟夫所說,根本不涉及到fs.writeFile()

在我的應用程序中實際上有兩個文件寫入「併發」運行。在我的問題和另一個問題中列出的一個,在計算一些平均值時逐漸寫入數據。

另一個逐步編寫函數有一個錯誤(拼寫錯誤的變量名稱),導致在操作過程中(在連續寫入之間)引發參考錯誤。這個例外,由於某種原因,我不太明白,沒有出現在連鎖店的任何地方。根據Q文檔,Promise.done()應該拋出任何未處理的異常,但事實並非如此。

在promise鏈中添加了幾個fail()處理程序後,我能夠找到bug並實現整個應用程序的合理行爲。

因此,錯誤與錯誤的編程風格(不正確處理異常)相關,而不是與fs模塊相關。然而,我不能相信可能會有這樣的事情,像未處理的異常可能會丟失,並且永遠不會出現在白天。另外我幾乎不能相信異步操作中的異常會影響另一個非相關的異步操作A

+0

omg謝謝!你節省了許多天的工作。一個fs回調沒有被調用,我不知道爲什麼我試圖調試節點下一步會一直試圖調試節點源,當我忘記了一些在我的代碼等待^^ – Vinz243

0

我有一個類似的問題,與fs.stat 問題是,我正在寫一個咕task任務,任務並不知道它是異步的,所以同步代碼完成,並在fs.stat回調之前終止應用程序可以被稱爲。

這可能不是你的問題,但它可能會幫助其他人。

製作咕嚕任務可以做這樣的: Wait async grunt task to finish

相關問題