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