我正在编写一个小文本文件(~500 B),但奇怪的是,如果我使用fs.writeFile(.)之类的异步方法编写,就会得到一个空文件。(或WriteableStream的写/结束方法)。
这样做是可行的:
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'); }
});我在寻找类似的帖子,但在其中一篇文章中,我发现问题是别的(调用另一个函数,返回内容),但我的内容是文本字符串(通过调试验证)。
类似的帖子:fs.writeFile() doesn't return callback
Platform> Win8.1 x64
NodeJS> x64 0.12.0
使用实际写入文件的函数编写的应用程序是使用回调以“普通nodejs”风格编写的,但随着它变得更加复杂,我使用Q和main重写了主要处理流。现在,处理就这样开始了:
(主要模块)
var qfs = require('q-io/fs') ;
...
qfs.read( configFile )
.then( doSomeConfig )
.then( function( config ) {
var promise = qfs.read( config.inputFile, someOptions );
return promise ;
})
.then( processMyInputData /* (binaryData) returns {Core} */ )
.then( writeMyOutputData /* (core) returns {undefined} */ )
.fail( reportSomeErrors /* (reason) returns {undefined} */ )
.done( reportFinished ) ;关键是,在主流中,fail函数也从不报告任何问题。函数reportFinished()报告一切正常,没有地方抛出任何异常,因为上面的原始片段是位于另一个模块中并作为writeMyOutputData( core )的一部分调用的函数,因此不可能执行任何异常抛出或任何类型的错误处理。
然而,在阅读了约瑟夫的评论后,我怀疑标准fs模块和q/fs之间可能有一些干扰。
发布于 2015-05-20 08:29:46
好的,在仔细检查后发现了问题。正如约瑟夫提到的,与fs.writeFile()完全无关。
在我的应用程序中,实际上有两个文件写正在“并发”运行。一个列在我的问题中,另一个,写数据时,逐步计算一些平均数。
另一个逐步写入函数有一个错误(拼写错误的变量名),导致在操作过程中(在连续写入之间)抛出一个引用错误。这个例外,由于某种原因,我不太明白,没有出现在链的任何地方。根据Q文档,Promise.done()应该抛出任何未处理的异常,但事实并非如此。
在承诺链中添加了几个able ()处理程序之后,我就能够找到bug并实现整个应用程序的合理行为。
因此,错误与错误的编程风格有关(没有正确地处理异常),而不是fs模块。然而,我不能相信会有这样的事情,如未经处理的异常,可能会丢失,永远不会出现在白天。另外,我很难相信异步操作B中的异常会影响另一个与之无关的异步操作A。
发布于 2016-10-12 15:14:38
我对fs.stat也有类似的问题,问题是我正在编写一个繁重的任务,任务不知道它是异步的,所以同步代码完成了,并在调用fs.stat回调之前终止了应用程序。
这可能不是你的问题,但它可能会帮助别人。
做一个繁重的任务可以这样做:Wait async grunt task to finish
https://stackoverflow.com/questions/30307208
复制相似问题