Я узнаю о Javascript Promise
и async
/ await
. Приведенный ниже пример кода асинхронно считывает и анализирует файл JSON в файле node.js ( my node.js версия v10.0.0 ).
В примере кода функция ChainReadJson и функция AwaitReadJson выполняют одно и то же, читая и анализируя файл JSON. Разница в том, что функция ChainReadJson использует цепочку обещаний, а функция 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);
}
При написании кода для функции ChainReadJson с использованием цепочки обещаний у меня возникли трудности с контролем результатов выполнения и ошибок.
Однако при написании кода для функции AwaitReadJson с использованием async / await эти трудности в основном исчезают.
Правильно ли я понимаю преимущества async / await? Каковы недостатки async / await по сравнению с цепочкой обещаний?
(Пример кода является модифицированной версией кода в этом ответе . Оригинальный код использует только цепочку обещаний и написан, чтобы точно знать, где в цепочке произошла ошибка и что является ошибкой )