我想使用JavaScript运行一系列SQLite查询。这些查询获取多个表的最新更新时间戳。例如:
SELECT last_updated FROM students ORDER BY last_updated DESC LIMIT 1;
SELECT last_updated FROM docs ORDER BY last_updated DESC LIMIT 1;
SELECT last_updated FROM logs ORDER BY last_updated DESC LIMIT 1;
SELECT last_updated FROM requests ORDER BY last_updated DESC LIMIT 1;
然后我将这些last_updated时间戳发送到服务器。当我想到如何做到这一点时,我会使用这样的东西:
var message = {};
sql('QUERY 1',[],function(row){
message.q1 = row.shift().shift(); // first row, first item
sql('QUERY 2',[],function(row){
message.q2 = row.shift().shift();
sql('QUERY 3',[],function(row){
message.q3 = row.shift().shift();
sql('QUERY 4',[],function(row){
message.q4 = row.shift().shift();
$.ajax('submit.php',{ // tell the server these things.
data: message,
type: 'POST',
success: function(response) {
console.log('Server replied: '+response+'\n');
},
error: function() {
console.log('HUHU.\n');
}
}
});
});
});
});
这会有效,但我发现嵌套SQL调用效率非常低。可能还有一些情况需要10个不同表中的数据。
有更有效的方法吗?
答案 0 :(得分:0)
对于此类嵌套构造,您可以使用 step 之类的内容。
它允许您使用如下语法:
Step(
function readSelf() {
fs.readFile(__filename, this);
},
function capitalize(err, text) {
if (err) throw err;
return text.toUpperCase();
},
function showIt(err, newText) {
if (err) throw err;
console.log(newText);
}
);
答案 1 :(得分:0)
你可以做的一件事是“并行”调用,并使用“屏障”模式来查看它们何时完成。
var calls_to_go = 4;
var callback = function(){
calls_to_go -= 1;
if(calls_to_go <= 0){
do_ajax_stuff();
}
}
sql('QUERY 1',[], callback);
sql('QUERY 2',[], callback);
sql('QUERY 3',[], callback);
sql('QUERY 4',[], callback);
当然,这个特定的代码只是给出一个想法。如果你使用其中一个异步编程库,他们应该都有一些功能,使写这类事情更愉快,如果你仍然想要手工做事,你应该确保事情更有条理,“4”不是没有硬编码,等等。