抱歉,刚从节点开始。这可能是一个非常新手的问题。
假设我有一些代码从文件系统的目录中读取一些文件:
var fs = require('fs');
fs.readdir(__dirname + '/myfiles', function (err, files) {
if (err) throw err;
files.forEach(function (fileName) {
fs.readFile(__dirname + '/myfiles/' + fileName, function (err, data) {
if (err) throw err;
console.log('finished reading file ' + fileName + ': ' + data);
module.exports.files.push(data);
});
});
});
请注意,所有这些都是异步发生的。假设我有一个执行此代码的 Mocha 测试:
describe('fileProvider', function () {
describe('#files', function () {
it.only('files array not empty', function () {
assert(fileProvider.files.length > 0, 'files.length is zero');
});
});
});
mocha 测试在文件读取完成之前运行。我知道这一点是因为在看到表示正在运行 mocha 测试的小点之后,我看到了 console.log 语句(至少我认为这是所指示的)。此外,如果我用 setTimeout 包围断言,则断言通过。
我应该如何构建我的代码以确保完成异步文件操作?请注意,这不仅仅是测试的问题 - 我需要完全加载文件,然后才能在我的应用程序中进行实际工作。
我不认为正确的答案是同步读取文件,因为那会阻塞 Node 请求/响应循环,对吧?
奖励问题:
即使我将断言放入超时值为 0 的 setTimeout 中,测试仍然通过。这是因为仅仅将它放在 setTimeout 中就会将它踢到处理链的末尾还是什么东西让文件系统工作首先完成?