传统的回调
现在,我们有三个 markdown 文件 file1.md
、file2.md
、file3.md
,我们想要统计这三个文件的大小信息,并输出为以下格式:
{ file1: 5384, file2: 2712, file3: 13942 }
在 Node 中,我们知道 fs.stat
这个异步 API 可以用来获得文件信息,该方法接受两个参数:
path
:文件路径;callback
:一个 error-first 型的回调函数。
使用最 传统 的回调方法,我们处理如上问题的代码如下:
const fs = require('fs');
function error(err) {
throw new Error(err);
}
function main() {
const sizeInfo = {
'file1': 0,
'file2': 0,
'file3': 0
};
fs.stat('file1.md', function(err, stat) {
if(err) return error(err);
sizeInfo['file1'] = stat.size;
fs.stat('file2.md', function(err, stat) {
if(err) return error(err);
sizeInfo['file2'] = stat.size;
fs.stat('file3.md', function(err, stat){
if(err) return error(error);
sizeInfo['file3'] = stat.size;
console.dir(sizeInfo);
});
})
});
}
main();
因为是三个文件,我们用传统的回调方式写出了三层的嵌套,整个代码呈现 > 型,形成了回调地狱(callback hell)。如果显示器尺寸不够,甚至需要拖动滚动条才能阅览整个代码,十分影响编码时的快感。其次,对于熟悉 JAVA,PHP,或者 C++ 语言的开发者,不能用 try-catch
进行错误处理,而需要撰写许多的 if-else
来处理异常或者错误,就更是蛋疼了。
为了从深陷的回调地狱中爬出来,下一节中,我们将使用 ES6 提供的 generator 来优化异步逻辑。