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);
        });
});
  • Вопрос задан
  • 96 просмотров
Решения вопроса 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').
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы