使用nodejs和SqlLite进行顺序查询

时间:2015-11-08 08:03:30

标签: node.js sqlite

这仍然是nodejs思维方式的新手,并且对如何做到这一点有疑问

这里有一段代码,可以在我从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();

如果image_status表为空,则直接转到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()或者有更好的方法吗?

由于

1 个答案:

答案 0 :(得分:1)

显然,您的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()
     }
});

对于异步编程,您始终需要显式指定所有执行路径,例如,使用ifelse,如上所示。请注意,如果您看到单个if没有正确的else,特别是后面跟着其他函数调用,就像您的示例中一样。事情可能无法按所需顺序执行。