让我们看下第一个例子,初步了解使用 Promise 会是怎么样的。
在 Node.js 风格的回到中,异步地读取一个文件的内容看起来像这样:
fs.readFile('config.json',
function (error, text) {
if (error) {
console.error('Error while reading config file');
} else {
try {
let obj = JSON.parse(text);
console.log(JSON.stringify(obj, null, 4));
} catch (e) {
console.error('Invalid JSON in file');
}
}
});
使用 Promise ,相同功能的实现像这样:
readFilePromisified('config.json')
.then(function (text) { // (A)
let obj = JSON.parse(text);
console.log(JSON.stringify(obj, null, 4));
})
.catch(function (reason) { // (B)
// File read error or JSON SyntaxError
console.error('An error occurred', reason);
});
仍然有回调,但是这些回调通过函数返回结果( Promise )上的方法( then()
和 catch()
)来提供。行 B 的错误回调在两个方面是比较方便的:首先,仅用于处理错误(对比一下之前例子中的 if(error)
和 try-catch
);其次,可以在某一个地方处理 readFilePromisified()
和行 A 处的回调产生的错误。
readFilePromisified()
的代码在后面展示。