2

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

有没有更有效的方法来做到这一点?

4

2 回答 2

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);
  }
);
于 2013-03-04T15:06:29.453 回答
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”是'没有硬编码,等等。

于 2013-03-04T15:07:06.743 回答