首页 > 解决方案 > Nodejs 阻止代码执行,直到它接收到 TCP 命令(挂起一个 GUI 事件)

问题描述

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

而且我遇到了阻塞执行代码而没有阻塞 TCP 侦听器(socket.on(‘data’, ()=>{})的问题……</p>

为什么我需要它:我需要它来从挂起的 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 在使数据库调用“同步”方面帮助了我很多……</p>

    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
  }
}

我已经尝试过 deasync 但它会阻止事件侦听器......我让它与 Promise 一起工作但在这种情况下它不会工作,因为代码库是用 js 为“旧”服务器编写的,我无法重写该代码库 Promise 示例:

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);
            }
           
        });

你可以帮帮我吗?

标签: javascriptnode.jsdom-eventsnode-modulesevent-loop

解决方案


推荐阅读