Javascript Nodejs阻止代码执行,直到收到TCP命令(挂起GUI事件)
我正在编写一个从Java+Rhino到nodeJS的TCP服务器 我有一个问题,就是在不阻塞TCP侦听器的情况下阻塞代码的执行(Javascript Nodejs阻止代码执行,直到收到TCP命令(挂起GUI事件),javascript,node.js,dom-events,node-modules,event-loop,Javascript,Node.js,Dom Events,Node Modules,Event Loop,我正在编写一个从Java+Rhino到nodeJS的TCP服务器 我有一个问题,就是在不阻塞TCP侦听器的情况下阻塞代码的执行(socket.on('data',()=>{}) 为什么我需要它:我需要从挂起的GUI获得同步响应…在Java中,它由子TCP侦听器进程覆盖,在主进程中有一个类似以下的循环: // simulate message loop boolean enddialog = false; int endtype = 0; try {
socket.on('data',()=>{}
)
为什么我需要它:我需要从挂起的GUI获得同步响应…在Java中,它由子TCP侦听器进程覆盖,在主进程中有一个类似以下的循环:
// simulate message loop
boolean enddialog = false;
int endtype = 0;
try {
while (!end) {
String s = "";
s = ess.dequeueCommand();
if (s.equals("mennu1")) {
end = true;
endtype = 0;
}
if (s.equals("menu2")) {
end = true;
endtype = 1;
}
}
} catch (Exception e) {
}
Deasync对我进行数据库调用“sync”有很大帮助
var deasync = require('deasync');
module.exports = function DB(){
var knex = require('knex')(require("./../../config").DB);
this.executeRowsetParam = (sql, param) => {
let done = false;
knex.raw(sql, param).then((r => {
done = r;
})).catch((e => {
throw "Error in query "+ e
}))
deasync.loopWhile(function () { return !done; });
return done
}
}
我已尝试取消同步,但它将阻止事件侦听器…
我用Promise让它工作,但在这种情况下它不会工作,因为有一个用js为“旧”服务器编写的代码库,我没有办法重写这个代码库
承诺示例:
return new Promise( (res) => {
if(this.sel == null){
let callb = (d)=>{
var ed = Buffer.from(d);
this.GetDataStricte(ed).then((da)=>{
res(da);
this.socket.removeListener('data',callb);
});
}
this.sel = this.socket.on('data',callb);
}
});
你能帮我吗?你不能“阻止代码执行”然后等待node.js中的其他事件。node.js世界不是这样工作的。阻止代码执行将阻止事件循环,这意味着您永远无法获得您正在等待的事件。如果您要移植到node.js,您必须重写异步执行模型。网络I/O无法绕过它外接程序?我是否可以编写可以作为子进程运行的外接程序,或者使用tcp服务器启动一些在我停止执行时仍能工作的节点子进程?如果您试图阻止网络I/O,那么node.js对您来说就是一个错误的平台。如果您备份并描述您试图解决的总体问题(不是您试图使其工作的解决方案),然后我们可能会帮助您展示如何使用非阻塞I/O解决问题。到目前为止,您在这里所做的工作就像您描述了一些问题,并尝试了一些问题的解决方案,但您走的是错误的体系结构道路,因此我们只能在您描述原始问题时提供帮助。您可以从本机代码中执行任何您想要的操作请继续,因为本机代码可以做本机代码可以做的任何事情。不过,我很怀疑这是解决总体问题所必需的,但在我们了解真正的问题是什么之前,我们无法建议如何使用node.js体系结构来解决它。