我正在学习Javascript中的Promise
和async
/await
。下面的示例代码以异步方式在node.js(我的node.js版本是v10.0.0)中读取和解析JSON文件。
在示例代码中,ChainReadJson函数和AwaitReadJson函数做着相同的事情,都是读取和解析JSON文件。不同之处在于ChainReadJson函数使用了Promise链,而AwaitReadJson函数使用了async/await。
const FS = require("fs");
function ReadFile(fileName) {
return new Promise((Resolve, Reject) => {
FS.readFile(fileName, 'utf8', (error, result) => {
if (error)
Reject(error);
else
Resolve(result);
});
});
}
// function using promise chain
function ChainReadJson(fileName, CallBack) {
ReadFile(fileName)
.then(
res => JSON.parse(res),
err => {
Message(-1, err.message);
}
)
.then(
res => {
if (res !== undefined)
CallBack(fileName, res);
},
err => {
Message(-2, err.message);
}
);
}
// function using async/await
async function AwaitReadJson(fileName, CallBack) {
let res, json;
try {
res = await ReadFile(fileName);
}
catch (err) {
Message(-1, err.message);
return;
}
try {
json = JSON.parse(res);
}
catch (err) {
Message(-2, err.message);
return;
}
CallBack(fileName, json);
}
ChainReadJson('test.json', PrintJSON);
AwaitReadJson('test.json', PrintJSON);
// common functions
function PrintJSON(fileName, json) {
console.log(`JSON[${fileName}]:`, json);
}
function Message(n, str) {
console.log(`[${n}]`, str);
}
使用Promise链编写ChainReadJson函数时,我在控制执行结果和错误方面遇到了困难。但是,当使用async/await编写AwaitReadJson函数的代码时,这些困难大部分都消失了。
我是否正确理解了async/await的优点?与Promise链相比,async/await有哪些缺点?
(示例代码是此答案中的代码的修改版本。原始代码仅使用Promise链,并编写以确切知道链中发生错误的位置和错误信息)
JSON.parse
的返回值不是undefined
时才执行回调函数,而在 await 的情况下,总是执行回调函数。 - cowbertres !== undefined
只有在JSON.parse
返回undefined时才会执行,但这永远不会发生,因为它会抛出SyntaxError。 - cowbert