Node.js 使用nodejs和SqlLite的顺序查询
因此,对于Nodej的思维方式来说还是相当陌生的,我有一个关于如何最好地做到这一点的问题 下面是一段代码,我从SqliteDB获取两个id,然后将它们发送到客户端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(
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
,尤其是后面跟着其他函数调用,请保持警惕,如您的示例所示。事情可能不会按预期的顺序执行