假设要编写一些异步的代码:
- 打开路径的句柄
- 判断路径是否指向一个文件
- 如果路径指向一个文件,加载这个文件的内容
- 关闭句柄并将内容返回给调用者
函数如下所示:
var fs = require("fs");
function load_file_contents(path, callback) {
fs.open(path, 'r', function(err, file) {
if (err) {
callback(err);
return;
} else if (!file) {
callback({error: "无效句柄", message: "fs.open未能正确打开文件!"});
return;
}
fs.fstat(file, function (err, stats) {
if (err) {
callback(err);
return;
}
if (stats.isFile()) {
var buf = new Buffer(10000);
fs.read(file, buf, 0, 10000, null, function (err, br, buf) {
if (err) {
callback(err);
return;
}
fs.close(file, function (err) {
if (err) {
callback(err);
return;
}
callback(null, buf.toString('utf8', 0, br));
})
})
} else {
callback({error: "不是文件", message: "无法加载文件夹"});
return;
}
})
});
}
//加载D盘下的info.txt文件
load_file_contents('d:/info.txt', function (err, contents) {
if (err) {
console.log(err);
return;
}
console.log(contents);
})
不难发现,以上代码从一开始就深度嵌套。当嵌套层度超过一定程度时,代码的可读性就降低了。
要解决这个问题,可以使用async模块。