为什么使用promise的asynchronousIO会生成一个零长度的文件?

任何人都可以找出这个代码有什么问题吗? 我试图写一个文件的less量字节,我得到的是一个零长度的文件没有错误报告。

我试图在node.js中使用asynchronous文件IO和bluebird promise来将一些数据写入本地文件。 我已经使用callback函数成功编写了此函数的同步版本和asynchronous版本。 但是,因为callback版本嵌套地狱,有各种各样的error handling问题,并不容易维护,我想我会尝试一个版本使用承诺,而不是因为这应该是它的长处(更好的error handling,更less的嵌套,更容易顺序asynchronous操作)。

不幸的是,承诺版本只会导致长度为零的文件。 以下是承诺版本的代码:

// at initialization time var Promise = require('bluebird'); var fs = Promise.promisifyAll(require('fs')); // code in a function var header = new Buffer('[temperatures] {"formatVersion": "1", "fields": ["t", "atticTemp", "outsideTemp"]}\r\n'); filename += ".new"; console.log("async write started"); var fd; fs.openAsync(filename, "w", 438).then(function(ffd) { fd = ffd; return fs.writeAsync(fd, header, 0, header.length, null); }).then(function(args /* [written, buffer] */) { var written = args[0]; console.log("bytes written =" + written); if (written !== header.length) { console.log("not all data written"); throw new Error("not all data written"); } // lots more data to write here return fs.closeAsync(fd); }).then(function() { fd = null; console.log(" async write finished"); }).catch(function(e) { // if (fd) fs.closeAsync(fd); console.log(e, "data.writeData() - error writing data (new format)"); }); 

我已经做了所有我知道如何做debugging。 所有预期的console.log()错误消息都以所需的顺序显示。 我已经validation了所有的返回值和参数。 没有任何错误报告。 我再次运行之前删除了以前的文件。 我在我的callback版本中使用相同的参数和文件名,工作得很好(这似乎排除了文件权限问题)。 我重新启动了电脑(顺便说一句,这是一个树莓派)。

我很难过 我认为这一定是愚蠢的,我在使用承诺时做错了,但是我不能为了我的生活而看到什么是错的。

好的,我明白了。 在应用程序的正常运行中调用该函数时,该函数可以很好地工作。 而且,如果我查看它在应用程序仍在运行时生成的文件,则文件很好。

但是(这是问题发生的地方),我也调用这个函数,当应用程序退出。 而且,猜猜看,在出口事件处理程序中不能使用这些types的asynchronous操作,而不会造成问题。 它只要创build新的空文件,然后应用程序退出,这是剩下的东西(只是在磁盘上新创build的空文件)。

这个特殊的函数有一个参数传入,以确定写入是否需要同步或asynchronous(仅仅是因为这个原因),而我还没有写入新的promisetypes代码的同步部分(我已经写了同步版本的我用过的其他版本的代码)。

奇怪的神秘解决了。 而且,这是愚蠢的。 没有什么直接的承诺,但它是一个asynchronous的问题。

另外一个谜就是为什么我的代码是asynchronous版本的,但是使用callback而不是承诺没有显示这个问题? 显然,在stream程退出之前它完成了工作,但承诺版本没有。