控制node.js / meteor中的异步执行流程

时间:2013-12-29 23:01:35

标签: node.js sqlite meteor

我正在使用带有' http-methods'的陨石应用程序。来自大气和' node-sqlite3'来自npm的包裹。考虑流动的代码。

var results = null;
HTTP.methods({
    'list': function(data) {
      var sqlite3 = Npm.require('sqlite3').verbose();
      var db = new sqlite3.Database(':memory:');

      db.serialize(function() {
        db.run("CREATE TABLE lorem (info TEXT)");

        var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
        for (var i = 0; i < 10; i++) {
            stmt.run("Ipsum " + i);
        }
        stmt.finalize();

        db.all("SELECT rowid AS id, info FROM lorem", function(err, rows) {
            console.log(rows);
            results = rows;
        });
      });

      console.log("Closing DB");
      db.close();

      console.log("Sending back response");
      console.log(results);

      return results;
    }
  });

这里使用domain / list调用上面的函数。我想返回resultSet作为对请求的响应。但不是它&#39; null&#39;已被退回。控制台的输出如下。

I20131229-23:50:20.092(1)? Closing DB
I20131229-23:50:20.113(1)? Sending back response
I20131229-23:50:20.117(1)? null
I20131229-23:50:20.172(1)? [ { id: 1, info: 'Ipsum 0' },
I20131229-23:50:20.181(1)?   { id: 2, info: 'Ipsum 1' },
I20131229-23:50:20.182(1)?   { id: 3, info: 'Ipsum 2' },
I20131229-23:50:20.183(1)?   { id: 4, info: 'Ipsum 3' },
I20131229-23:50:20.199(1)?   { id: 5, info: 'Ipsum 4' },
I20131229-23:50:20.199(1)?   { id: 6, info: 'Ipsum 5' },
I20131229-23:50:20.199(1)?   { id: 7, info: 'Ipsum 6' },
I20131229-23:50:20.202(1)?   { id: 8, info: 'Ipsum 7' },
I20131229-23:50:20.202(1)?   { id: 9, info: 'Ipsum 8' },
I20131229-23:50:20.203(1)?   { id: 10, info: 'Ipsum 9' } ]

请建议适当的解决方案。

注意:给出的代码是实际代码的同义词。如果您想了解更多详情,请与我们联系。

2 个答案:

答案 0 :(得分:0)

编辑:您正在db回调之前输出'results'。您只需在查询后立即关闭数据库连接。我可以猜测db模块在关闭之前完成查询,因为它最终会输出返回的行。

您需要关闭并返回回调。

db.all("SELECT rowid AS id, info FROM lorem", function(err, rows) {
    console.log(rows);
    results = rows;

    db.close();
    callback(results);
});

编辑:

这是一个更好的例子,使用回调代替return:

var results = null;
HTTP.methods({
'list': function(data, callback) {
  var sqlite3 = Npm.require('sqlite3').verbose();
  var db = new sqlite3.Database(':memory:');

  db.serialize(function() {
    db.run("CREATE TABLE lorem (info TEXT)");

    var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
    for (var i = 0; i < 10; i++) {
        stmt.run("Ipsum " + i);
    }
    stmt.finalize();

    db.all("SELECT rowid AS id, info FROM lorem", function(err, rows) {
        console.log(rows);
        results = rows;

        db.close();            

        // this returns the data in a callback function
        callback(results);
    });
  });

  // this will return 'results' before the query returns any results
  // return results;
}
});

答案 1 :(得分:0)

你可以通过放置一个javascript的延迟方法来解决这个问题,该方法会暂停执行指定的时间。你可以停止执行几秒钟,你的问题就会解决。