首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fs.writeFile回调从不被调用,WritableStream.write也是如此,等等

fs.writeFile回调从不被调用,WritableStream.write也是如此,等等
EN

Stack Overflow用户
提问于 2015-05-18 15:28:06
回答 2查看 2.8K关注 0票数 2

我正在编写一个小文本文件(~500 B),但奇怪的是,如果我使用fs.writeFile(.)之类的异步方法编写,就会得到一个空文件。(或WriteableStream的写/结束方法)。

这样做是可行的:

代码语言:javascript
复制
var scanInfo = getScanInfo( core ); // returns several lines delimited by \r\n
fs.writeFileSync( filename, scanInfo, 'ascii' );

这将创建空文件,回调函数永远不会产生任何输出:

代码语言:javascript
复制
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重写了主要处理流。现在,处理就这样开始了:

(主要模块)

代码语言:javascript
复制
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之间可能有一些干扰。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-20 08:29:46

好的,在仔细检查后发现了问题。正如约瑟夫提到的,与fs.writeFile()完全无关。

在我的应用程序中,实际上有两个文件写正在“并发”运行。一个列在我的问题中,另一个,写数据时,逐步计算一些平均数。

另一个逐步写入函数有一个错误(拼写错误的变量名),导致在操作过程中(在连续写入之间)抛出一个引用错误。这个例外,由于某种原因,我不太明白,没有出现在链的任何地方。根据Q文档,Promise.done()应该抛出任何未处理的异常,但事实并非如此。

在承诺链中添加了几个able ()处理程序之后,我就能够找到bug并实现整个应用程序的合理行为。

因此,错误与错误的编程风格有关(没有正确地处理异常),而不是fs模块。然而,我不能相信会有这样的事情,如未经处理的异常,可能会丢失,永远不会出现在白天。另外,我很难相信异步操作B中的异常会影响另一个与之无关的异步操作A

票数 6
EN

Stack Overflow用户

发布于 2016-10-12 15:14:38

我对fs.stat也有类似的问题,问题是我正在编写一个繁重的任务,任务不知道它是异步的,所以同步代码完成了,并在调用fs.stat回调之前终止了应用程序。

这可能不是你的问题,但它可能会帮助别人。

做一个繁重的任务可以这样做:Wait async grunt task to finish

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30307208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档