SQLite回调有效的解决方案

时间:2013-03-04 15:02:46

标签: javascript sqlite

我想使用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个不同表中的数据。

有更有效的方法吗?

2 个答案:

答案 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”不是没有硬编码,等等。