Async и Await
Часть раздела Основы Node.js путешествия по Node.js на Coddy. Урок 16 из 24.
Цепочка вызовов .then читается не так, как вы представляете себе эти шаги: прочитать, затем разобрать, затем сохранить.
Внутри функции async инструкция await приостанавливает выполнение, пока промис не завершится, и возвращает его значение. При отклонении промиса возникает исключение, поэтому для его обработки используют try и catch. В модуле await также работает на верхнем уровне.
import { readFile } from 'node:fs/promises';
const loadConfig = async () => {
try {
return JSON.parse(await readFile('config.json', 'utf8'));
} catch {
return {};
}
};
const config = await loadConfig();
console.log(config.port ?? 3000);Функция async всегда возвращает промис, поэтому и её вызывающий код должен ожидать его завершения. Забудьте добавить await — и вместо значения вы получите сам промис: Promise { <pending> }.
Задание
Легкоstore.jsтеперь выполняет чтение и запись с помощьюnode:fs/promises. Добавь недостающиеawait, чтобы каждая команда работала как раньше.notes.jsожидает завершенияstore.addиstore.remove, которые теперь являются асинхронными.
Сначала выполни node notes.js list, чтобы прочитать сообщение об ошибке, затем, когда всё заработает, выполни add и done 1.
Попробуйте сами
import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
const file = 'notes.json';
// readFile и writeFile теперь возвращают промисы. Дождитесь завершения каждого с помощью await.
const load = async () => {
if (!existsSync(file)) {
return [];
}
try {
return JSON.parse(readFile(file, 'utf8'));
} catch (err) {
console.error(`notes.json is damaged: ${err.message}`);
process.exit(1);
}
};
const store = {
notes: load(),
async save() {
writeFile(file, JSON.stringify(this.notes, null, 2));
},
async add(text) {
this.notes.push(text);
this.save();
return this.notes.length;
},
async remove(n) {
const [text] = this.notes.splice(n - 1, 1);
this.save();
return text;
},
};
export default store;
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы Node.js
1Запуск JavaScript в Node
Знакомство с NodeАргументы командной строкиКоманды