Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs阻止代码执行,直到收到TCP命令(挂起GUI事件)_Javascript_Node.js_Dom Events_Node Modules_Event Loop - Fatal编程技术网

Javascript Nodejs阻止代码执行,直到收到TCP命令(挂起GUI事件)

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 {

我正在编写一个从Java+Rhino到nodeJS的TCP服务器

我有一个问题,就是在不阻塞TCP侦听器的情况下阻塞代码的执行(
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体系结构来解决它。