Потому что node.js сам по себе однопоточный, никакой другой код за пределами x()
не будет работать до тех пор, пока x()
не вернется. Таким образом, вы не можете концептуально делать то, что вы пытаетесь сделать с помощью одной функции, которая работает синхронно.
Есть несколько библиотек, которые добавляют какую-то резьбу (с особыми ограничениями), которую вы могли бы использовать. Вы можете увидеть это сообщение для получения более подробной информации по некоторым из этих вариантов: How to create threads in nodejs
Если вы покажете нам, что делает код внутри x()
, мы могли бы предложить вам некоторые идеи о том, как перестроить этот код для достижения вашей цели. Если он имеет асинхронные операции (или может быть преобразован для использования асинхронных операций), то возвращается x()
, а другой код может работать, а node.js ожидает, что эти асинхронные операции будут выполнять свою работу, и вы можете сигнализировать о тех асинхронных операциях, которые они должны перестаньте делать свое дело. Но большую часть времени придется ждать асинхронных операций, чтобы эта схема работала.
Если вы можете переместить код x()
в отдельный процесс, вы можете запустить дочерний процесс, дать ему код для запуска, а затем убить весь дочерний процесс узла, если он не завершится в определенном количестве время. Это, очевидно, немного тяжелый способ справиться с этим вызовом функции, но это дает вам возможность убить всю среду, если это необходимо. Он также обеспечивает изоляцию процесса, если это полезно с точки зрения безопасности или конфиденциальности.
Вы думали об использовании [Web Workers] (https://developer.mozilla.org/en- США/документы/Web/API/Web_Workers_API/Using_web_workers)? –
@AlexMcMillan Я никогда не слышал о них раньше. Но мне нужно «require» nodejs модули. Модули также должны находиться в том же состоянии, что и в основном потоке. Поэтому я думаю, что веб-работники не являются хорошим решением для этого. – Brettetete