Примечание. Этот ответ, вероятно, не следует использовать в рабочем коде. Это взлом, и вы должны знать о последствиях.
Существует модуль uvrun (обновлен для более новых версий Nodejs здесь ), где вы можете выполнить один цикл цикла основного события libuv (который является главным циклом Nodejs) .
Ваш код будет выглядеть так:
function(query) {
var r;
myApi.exec('SomeCommand', function(response) {
r = response;
});
var uvrun = require("uvrun");
while (!r)
uvrun.runOnce();
return r;
}
(Вы могли бы альтернативно использовать uvrun.runNoWait()
. Это могло бы избежать некоторых проблем с блокировкой, но потребляет 100% CPU.)
Обратите внимание, что этот подход делает недействительным всю цель Nodejs, то есть иметь все асинхронное и неблокирующее. Кроме того, это может значительно увеличить глубину стека вызовов, что может привести к переполнению стека. Если вы запустите такую функцию рекурсивно, у вас наверняка возникнут проблемы.
См. Другие ответы о том, как изменить дизайн кода, чтобы сделать его «правильным».
Это решение, вероятно, здесь полезно только при тестировании и ESP. хочу синхронизировать и серийный код.