Javascript 排队SQL查询

Javascript 排队SQL查询,javascript,sql,node.js,asynchronous,callback,Javascript,Sql,Node.js,Asynchronous,Callback,我有一个通过UDP监听事件(字符串)的套接字。每次它得到一个字符串,就会生成一个SQL请求。我的问题是使它异步运行,以便在另一个查询运行时请求排队而不尝试访问数据库 伪: socket.on('message', function (msg) { switch (msg) { case "case1": storeRows(); break; //there's a new message every 1-2 sec

我有一个通过UDP监听事件(字符串)的套接字。每次它得到一个字符串,就会生成一个SQL请求。我的问题是使它异步运行,以便在另一个查询运行时请求排队而不尝试访问数据库

伪:

socket.on('message', function (msg) {
    switch (msg) {
        case "case1":
            storeRows();
            break;
    //there's a new message every 1-2 secs
    ...
}
var rows = []; //push results of all queries here
function storeRows() {
    rows.push(getFromDB());
}

function getFromDB() {
    var sqlString = "SELECT * ..."
    var req = new Req(sqlString, function(err, rowCount) {
...
    }
var resultsArray = [];
req.on('row', function (cols) {
    //add results to resultsArray
}
return resultsArray;
}
基本上,我需要getFromDB()异步运行,等待上一个查询完成后再运行下一个查询。这个我不知道怎么做。我正在使用tedious.js访问SQL Server DB

编辑:


您可以构建类似处理器的东西,它构建基于数组的队列,并且在任何时候只允许在数据库上执行一个查询。下面是一个使用带承诺的异步/等待函数的示例:

类处理器{
构造函数(){
this.queue=[];
this.queryRunning=false;
}
//主查询功能。
//将查询添加到队列,然后尝试处理该队列。
查询(查询){
返回新承诺((解析器)=>{
这个是.queue.push({
查询
分解器
});
this.tryProcessNext();
});
}
//尝试处理队列的下一个元素
tryProcessNext(){
让自我=这个;
//如果它正在运行,或者队列是空的,只需什么都不做
if(this.queue.length==0 | | this.queryRunning)
返回;
this.queryRunning=true;
//获取队列中第一个添加的元素(同时缩短数组)
设qry=this.queue.shift();
//运行查询,并使用'qry.resolver()`解析原始承诺。
setTimeout(函数(){
解析器(`Result:${qry.query}`);
self.queryRunning=false;
//如果队列中还有其他内容,请尝试下一步处理该内容
self.tryProcessNext();
}, 1500);
}
}
常量处理器=新处理器();
设i=0;
//演示通过websocket添加查询的简单函数。
setInterval(异步函数(){
log(`Adding query:query${++i}`);
var res=wait processor.query(`query${i}`);
控制台日志(res);

}, 1000);getFromDB
的真实内容吗(省略SQL即可)?当发送一个请求时,另一个请求正在运行,它返回
请求只能在LoggedIn状态下发出,而不能在sentclienterquest状态下发出
我们无法帮助您查看更多的代码。但听起来问题不是同步还是异步,而是其他类型的状态管理。请更新您的问题,用简单的查询演示问题(我们中的许多人都可以访问SQL Server,并可以快速建立本地示例来帮助您)。@T.J.Crowder这与状态管理有什么关系?这个问题似乎相当直截了当。我有一条消息需要每隔1-2秒查询一次数据库,我希望确保查询不会并行运行。我在下面提供了一个示例。让您提供给
new Req()
调用的回调使用数据或错误响应当前消息。然后,如果您的请求队列中仍然有请求,请让它也这样做。因此,通过套接字到达的所有请求都可以保持同步。只有触发套接字发送响应的数据库查询是异步的,因为您希望等待prev查询完成,而不是并行运行所有查询。存储挂起的查询可以像推送和弹出数组一样简单。
var config = {
    userName: "admin",
    password: "pw",
    server: "test",
    domain: "test",
    options: {
        port: '10322'
    }
}
connection = new Connection(config);
connection.on('connect') {
    isConnected = true;
}

getCoordinates(vehicleID, fromTime, toTime) { 
    var SQLString = "Select * FROM coordinates WHERE TimeStamp BETWEEN '" + fromTime + "' AND '" + toTime + "' AND vehicleID = " + vehicleID;
    var rowsToSend = [];
    var req = new Req(SQLString, function(err, rowCount) {
        if (err) console.log(err)
        else console.log(rowCount);
    }

    req.on('row', function (columns) {
        var rowArray = [];
        columns.forEach(function (column) {
            var colValue = column.value;
            switch (column.metadata.colName) {
                case "ID":
                    if (rowArray.length > 0)                   
                        rowsToSend.push(rowArray);
                        rowArray = new Array();
                        break;

                default:                     
                    rowArray.push(colValue);
                    break;
                }
         });
         rowsToSend.push(rowArray);
    });
    connection.execSql(req);

    req.on('doneProc', function () {
        return(rowsToSend);
    }  
}

//called every few seconds
function runQueries() {
    someArray.push(getCoordinates ());
}