【发布时间】:2014-10-31 00:58:13
【问题描述】:
谁能弄清楚这段代码有什么问题?我正在尝试将少量字节写入文件,但我得到的只是一个零长度文件,没有报告任何错误。
我正在尝试在 node.js 中使用异步文件 IO 和 bluebird 承诺将一些数据写入本地文件。我已经成功地编写了这个函数的同步版本和使用回调的异步版本。但是,因为回调版本是嵌套地狱并且有各种各样的错误处理问题并且不是很容易维护,所以我想我会尝试使用promises的版本,因为这应该是它的强项(更好的错误处理,更少的嵌套,更容易排序异步操作)。
不幸的是,promise 版本只会生成零长度文件。这是 Promise 版本的代码:
// 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)");
});
我已经完成了我知道如何进行调试的所有工作。所有预期的console.log() 错误消息都以所需的顺序出现。我已经验证了所有返回值和参数。不会以任何方式报告错误。在再次运行之前,我已经删除了以前的文件。我在我的回调版本中使用了相同的参数和文件名,效果很好(这似乎排除了文件权限问题)。我已经重新启动了计算机(顺便说一下,这是一个 Raspberry Pi)。
我被难住了。我认为这一定是我在使用 Promise 时做错了一些愚蠢的事情,但我一辈子都看不出有什么问题。
【问题讨论】:
-
+1 使用蓝鸟 :)
-
这对我有用。你能让它更具重现性吗?
-
@simonzack - 我得看看能否在独立的 node.js 应用程序中重现它。
-
@simonzack - 嗯。它适用于同一平台上的独立 node.js 应用程序。好的,显然代码在结构上没有任何问题。现在,我想知道可能导致问题的应用程序上下文是什么?此代码似乎对其他任何内容没有任何依赖关系。传入的唯一数据是创建的文件名,因此这不是垃圾。我已经注释掉了这个函数中的所有其他代码并且没有改变。我没有看到任何意外的全局变量(也在严格模式下运行)。这很奇怪。还有什么要寻找的想法吗?
标签: javascript node.js raspberry-pi promise bluebird