Я работаю над приложением Zappa, и в настоящее время я пытаюсь сделать небольшой скрипт наблюдения, который останавливает сервер, очищает require.cache
, затем повторно требует и перезапускает сервер при изменении файла, что-то вроде:
# watch all dependent files
for file of require.cache
fs.watch file, ->
# attach a handler to 'close'
# -- here's the issue: this takes far too long to trigger
server.on 'close', ->
server = require './server'
server.start()
# log the new server's id
console.log server.id
# stop the current server instance
server.stop()
# clear require's cache
delete require.cache[f] for f of require.cache
У меня также есть строка console.log server.id
в моем обработчике запросов, поэтому я могу проверить, совпадают ли идентификаторы.
Итак, что происходит: когда я меняю зависимость, сервер останавливается, запускается новый и регистрируется новый идентификатор, и все это подливка. Однако в течение случайного промежутка времени запросы к серверу по-прежнему регистрируют старый идентификатор, указывая на то, что старый прослушиватель все еще каким-то образом подключен. В конце концов, слушатель, кажется, «переключается», и новый идентификатор регистрируется.
Обновление: кажется, это связано с событием close
(что неудивительно) — если я присоединю простой обратный вызов console.log 'close'
к событию close
, идентификатор начнет меняться после появления 'close'
. Однако запуск события close
может занять много времени (10 с+), почему это может занять так много времени?