这仍然是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()或者有更好的方法吗?
由于
答案 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()
}
});
对于异步编程,您始终需要显式指定所有执行路径,例如,使用if
和else
,如上所示。请注意,如果您看到单个if
没有正确的else
,特别是后面跟着其他函数调用,就像您的示例中一样。事情可能无法按所需顺序执行。