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

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

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