#javascript #node.js #async-await #fs
#javascript #node.js #асинхронное ожидание #fs
Вопрос:
У меня есть некоторый код, который сообщает, подключается к redis и возвращает обещание, например:
async connectionToRedisClient() {
return await this.connect('connect')
.then(() => {
log.info('Connected');
})
.catch(() => log.error('Error connecting to redis'));
}
Который позже используется для ожидания успешного соединения, прежде чем продолжить работу с алгоритмом:
await connectionToRedisClient()
Все это прекрасно работает само по себе и работает уже некоторое время — однако я добавляю fs.watch
функцию для запуска этого кода при появлении нового файла в каталоге.
fs.watch
Код работает нормально и пытается выполнить приведенный выше код, но внезапно останавливается на await и не завершается. Моя отладка приводит к этому коду и только к этому коду.
Если я удалю код redis, код завершится нормально. Есть ли проблема с использованием waits in fs.watch
? или у меня здесь какая-то путаница с кодом синхронизации и асинхронности? Имейте в виду, что если я перестану использовать fs.watch
, код redis будет в порядке, поэтому проблема напрямую не связана с моим кодом redis.
Смотрите Мой fs.watch
код для справки:
fs.watch('./targets', async (event, filename) => {
console.log('event is: ' event);
if (filename === 'file.txt') {
await main();
} else {
console.log('Incorrect file passed');
}
});
Комментарии:
1. Я попытался воспроизвести вашу ошибку, но, насколько я вижу, fs.watch отлично работает с асинхронностью. Есть ли у вас минимально воспроизводимый пример, а также какую версию узла вы используете?
2. Интересно, связано ли это с тем, что вы используете await избыточно в connectionToRedisClient() . Асинхронные функции неявно возвращают обещание, но эта функция явно возвращает обещание, поэтому я думаю, что нет необходимости использовать async / await в connectionToRedisClient()
3. @MichaelHorn Я использую версию 10.15.0 — я постараюсь добавить к вопросу минимально воспроизводимый пример — я также попробую ваше предложение 🙂
4. @MichaelHorn Интересно, что когда я удаляю как await внутри функции, так и ту, в которой она вызывается, код выполняется нормально, как и должно быть, но ни один из журналов консоли внутри then() или catch() никогда не выполняется
5. Вы все равно захотите использовать await при вызове connectionToRedisClient() , поскольку именно так возвращаемое обещание выполняется в асинхронной функции. Работает ли это, если ключевые слова async и await удалены из определения connectionToRedisClient(), но await все еще используется на сайте вызова?