Использование waits с помощью fs.watch() в node.js

#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 все еще используется на сайте вызова?