Для некоторых особых случаев, таких как 'require', имеет смысл блокировать выполнение, чтобы сделать вещи проще.
У меня похожий случай, мне нужен способ установить соединение с БД, заблокирован.И поскольку это происходит только один раз - когда приложение запускается и сохраняется в глобальном объекте для последующего повторного использования - это не повлияет на производительность.
Проблемы:
- узел не 'у него нет метода 'sleep'.
- есть некоторая хитрость с циклом обработки событий. Вы должны заблокировать его, но в то же время разрешить обрабатывать его соединения с базой данных.
На самом деле я уже сделал это, используя waitFor
от jasmine-node, но когда я посмотрел на него source - он очень сложный и использует C-расширения phantomjs.
И, к сожалению, простые while(true){...}
вещи не помогаютт работает.Например, приведенный ниже код не работает, я полагаю, потому что он блокирует цикл обработки событий и не позволяет узлу обрабатывать ожидаемое событие (своего рода взаимоблокировка в однопоточной среде :)).
waitsFor = (fun, message = "waitsFor timeout!", timeout = 1000) ->
start = new Date().getTime()
while true
if fun()
break
else if (new Date().getTime() - start) > timeout
throw new Error(message)
Но, может быть, как-то возможно сделать это каким-то другим простым способом, без дополнительных зависимостей, таких как phantomjs
и сложных C-расширений?