Node.js 使用nodejs和SqlLite的顺序查询

Node.js 使用nodejs和SqlLite的顺序查询,node.js,sqlite,Node.js,Sqlite,因此,对于Nodej的思维方式来说还是相当陌生的,我有一个关于如何最好地做到这一点的问题 下面是一段代码,我从SqliteDB获取两个id,然后将它们发送到客户端 client.on('join', function(data) { var last_new_id=0; var last_old_id=0; var db = new sqlite3.Database(file); db.serialize(function() { db.each(

因此,对于Nodej的思维方式来说还是相当陌生的,我有一个关于如何最好地做到这一点的问题

下面是一段代码,我从SqliteDB获取两个id,然后将它们发送到客户端

client.on('join', function(data) {
    var last_new_id=0;
    var last_old_id=0;
    var db = new sqlite3.Database(file);
    db.serialize(function() {
        db.each("SELECT last_new_id, last_old_id FROM image_status ", function(err, row) {
            if ( err ){
                console.log("**** ERROR IN SELECT ****");
                console.log(err);
            }else{
                last_new_id =  row.last_new_id;
                last_old_id =  row.last_old_id;
            }
        }, function() {
            client.emit('joined', {last_new_id: last_new_id, last_old_id: last_old_id} );
        });
    });
});
db.close();
如果图像_状态表为空,则直接转到client.emit

我想做的是,如果last_new_id或last_old_id为零,我想做另一个查询

我想我会试试这样的东西

}, function() {
     if ( last_new_id == 0 ) {
        //query the db with
        //SELECT image_id FROM image ORDER BY image_id DESC LIMIT 1
        last_new_id = getLastID();     
     } 
     client.emit('joined', {last_new_id: last_new_id, last_old_id: last_old_id} );
});
但实际情况是在返回getLastID select之前调用client.emit

我不确定如何同步调用getLastID(),或者有更好的方法吗


谢谢

显然,您的
getLastID
函数会触发查询数据库的异步调用。您需要将回调函数更改为初始查询,为
getLastID
函数添加额外的回调处理

例如:

}, function() {
     var emitIDs = function() {
        client.emit('joined', {last_new_id: last_new_id, last_old_id: last_old_id} );
     }
     if ( last_new_id == 0 ) {
        //query the db with
        //SELECT image_id FROM image ORDER BY image_id DESC LIMIT 1
        getLastID( function(image_id) {
           last_new_id = image_id
           emitIDs()
        })
        // getLastID must call the given callback
        // and use the determined image_id as first parameter
     }
     else {
        // alternative execution path if image_id is not requested
        emitIDs()
     }
});
对于异步编程,始终需要显式指定所有执行路径,例如使用
if
else
,如上所示。如果您看到单个
if
而没有正确的
else
,尤其是后面跟着其他函数调用,请保持警惕,如您的示例所示。事情可能不会按预期的顺序执行