(注:英文原文链接是这个)
看一下下面的读取文件并把它转化成JSON对象的同步js代码,它看起来可读性很好,但是你并不会想要使用它因为它是阻塞的,这意味着当你读取文件的时候你不能让代码做其他事
function readJSONSync(filename){
return JSON.parse(fs.readFileSync(filename, 'utf-8'));
}
为了使我们的代码更高效并且更有弹性,我们应该让涉及IO读写操作(或者说一个费时操作)变成异步的。最容易的方法是使用一个callback回调。一个幼稚的实现也许会让它出错:
function readJSON(filename, callback){
fs.readFile(filename, 'utf-8', function(err, res){
if(err) return callback(err);
callback(null, JSON.parse(res));
})
}
- 这个额外的参数callback可能让我们对哪个是input、哪个是返回值感到困惑
- It doesn’t work at all with control flow primitives.
- 它并不能处理由JSON.parse抛出的错误
所以我们需要一个能捕获JSON.parse抛出错误但又不能不小心将callback错误也捕获的函数。目前为止我们想出了下面的代码
function readJSON(filename, callback){
fs.readFile(filename, 'utf-8', function(err, res){
if(err) return callback(err);
try{
res = JSON.parse(res);
} catch(ex){
return callback(ex);
}
callback(null, res);
})
}
错误处理代码混论不说,我们始终没有解决多了一个额外的参数callback的问题,Promise帮助你能简单地处理错误,并且写非常整洁的没有callback的代码。关于Promise可以参考另一篇博文详解Promise对象