Задать вопрос
Kasperenysh
@Kasperenysh
Рецидив в особо острой форме))

Как заставить функцию работать асинхронно?

Хочу вынести часть логики в отдельную функцию, но основной код не хочет ждать чтение файла... пробовал несколько способов, но ни один не работает...
module.exports = async function(path) {
    await fs.readFile(`./server/db/${path}.json`, 'utf-8', (err, data) => {
        if (!err) {
            return data;
        }
    });
}


Пытался в функции сделать переменную и при получении записать data в нее, но она улетает раньше чем прочитается файл... и и разные конструкции асинхронности - не получается... подозреваю что проблема в коллбеке fs.readFile, но не могу придумать как обхитрить его....
Если нужно, вот код где пытаюсь вызвать эту функцию....
server.get('/catalog', (req, res) => {
    reader('catalog')
        .then(data => {
            res.send(data);
        });
});
  • Вопрос задан
  • 108 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Skillbox
    Node.js
    2 месяца
    Далее
  • Javascript.ru
    Курс по Node.js
    5 недель
    Далее
Решения вопроса 2
@alpeg
Правильная промисификация выглядит так - функция без ключевого слова async, но при её вызове нужен await или .then()
function foo(path) {
	return new Promise((resolve,reject)=>{
		fs.readFile(`./server/db/${path}.json`, 'utf-8', (err, data) => {err ? reject(err) : resolve(data); });
	});
}
// await foo('bar');
// foo('bar').then(result=>console.log(result));

Но вообще да, у ноды уже есть fs Promises API
The fs.promises API provides an alternative set of asynchronous file system methods that return Promise objects rather than using callbacks. The API is accessible via require('fs').promises or require('fs/promises').
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы