Вы не можете просто посыпать async
объявлениями своих функций и надеяться на магию.
async
- это способ справиться с Обещаниями. Для этого требуется, чтобы вы await
Promise находились внутри асинхронной функции, что, в свою очередь, требует, чтобы у вас была функция, которая возвращает Promise. Вы не делаете ничего из этого.
Сначала вам нужна функция, которая возвращает Обещание. Нативные асинхронные функции узла используют обратные вызовы и ничего не возвращают, поэтому, если вы хотите использовать нативный fs.writeFile()
и вместо этого возвращать Promise, вам нужно создать функцию-обертку. Этот процесс называется «обещание», и когда он выполняется вручную, он выглядит следующим образом:
function writeFileAsync(file, data){
return new Promise(resolve => {
fs.writeFile(file, data, err => {
if (err) throw err; else resolve();
})
});
}
У узла также есть утилита, которая делает одно и то же за один шаг для любой асинхронной функции в стиле узла (util.promisify(original)
).
const writeFileAsync = util.promisify(fs.writeFile);
Теперь, когда есть что-то, что мы можем await
, мы можем сделать функцию async
, которая ожидает ее (обратите внимание, что вам абсолютно необходимо блок try / catch):
async function test() {
try {
let filename = 'some/file';
console.log(`Creating file ${filename}`)
await writeFileAsync(filename, 'this is a file');
console.log(`Finished creating file ${filename}`)
} catch (err) {
console.log(`File ${filename} failed to write`);
console.log(err);
}
}
или мы можем использовать его с эквивалентной обычной .then()
и .catch()
семантикой Обещаний:
let filename = 'some/file';
console.log(`Creating file ${filename}`);
writeFileAsync(filename, 'this is a file')
.then(() => {
console.log(`Finished creating file ${filename}`
})
.catch((err) => {
console.log(`File ${filename} failed to write`);
console.log(err);
});