SQLite回调的高效解决方案

SQLite callback efficient solution

本文关键字:解决方案 高效 回调 SQLite      更新时间:2023-09-26

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

有更有效的方法吗?

对于这种嵌套结构,您可以使用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);
  }
);

你可以做的一件事是并行调用,并使用"barrier"模式来查看它们何时完成。

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"不是硬编码的,等等。