首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在node.js/meteor中控制异步执行流程

问在node.js/meteor中控制异步执行流程
EN

Stack Overflow用户
提问于 2013-12-30 07:01:35
回答 2查看 483关注 0票数 0

我正在使用一个陨石应用程序,其中包含来自atmosphere的'http-methods‘包和来自npm的'node-sqlite3’包。考虑一下流畅的代码。

代码语言:javascript
复制
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作为对请求的响应。但是返回的不是'null‘,而是null。控制台的输出如下所示。

代码语言:javascript
复制
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' } ]

请为这个问题提出一个合适的解决方案。

注意:给出的代码与实际代码同义。如果你想知道更多细节,请告诉我。

EN

回答 2

Stack Overflow用户

发布于 2013-12-30 07:06:17

编辑:在db回调之前输出“result”。您还可以在进行查询后立即关闭db连接。我可以猜到db模块在关闭之前完成了查询,因为它最终会输出返回的行。

你会想把关闭和返回放在回调中。

代码语言:javascript
复制
db.all("SELECT rowid AS id, info FROM lorem", function(err, rows) {
    console.log(rows);
    results = rows;

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

编辑:

下面是一个更好的例子,使用回调而不是返回:

代码语言:javascript
复制
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;
}
});
票数 0
EN

Stack Overflow用户

发布于 2014-05-15 19:05:58

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20831066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档