我正在使用一个陨石应用程序,其中包含来自atmosphere的'http-methods‘包和来自npm的'node-sqlite3’包。考虑一下流畅的代码。
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。控制台的输出如下所示。
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' } ]请为这个问题提出一个合适的解决方案。
注意:给出的代码与实际代码同义。如果你想知道更多细节,请告诉我。
发布于 2013-12-30 07:06:17
编辑:在db回调之前输出“result”。您还可以在进行查询后立即关闭db连接。我可以猜到db模块在关闭之前完成了查询,因为它最终会输出返回的行。
你会想把关闭和返回放在回调中。
db.all("SELECT rowid AS id, info FROM lorem", function(err, rows) {
console.log(rows);
results = rows;
db.close();
callback(results);
});编辑:
下面是一个更好的例子,使用回调而不是返回:
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;
}
});发布于 2014-05-15 19:05:58
您可以通过在javascript中放置一个延迟方法来解决这个问题,该方法会在指定的时间量内停止执行。你可以停止执行几秒钟,你的问题就解决了。
https://stackoverflow.com/questions/20831066
复制相似问题