我一直在处理节点和节点-sqlite3 3,并且需要基于许多查询构建一个报告:
var db = require('./db');
module.exports = {
getActivity : function (user_id, done) {
var report = {};
db.get('SELECT * FROM warehouse WHERE user_id = ?', user_id, function (err, warehouse) {
report.warehouse = warehouse;
db.all('SELECT * FROM shops WHERE warehouse_id = ?', report.warehouse.id, function (err, shops) {
report.shops = shops;
return done(report);
});
});
}
};我的目标是能够从一个路由生成一个报告,并将其序列化为一个JSON响应。以下是我的路线:
app.get('/api/hello',
auth.check,
function(req, res) {
hello.getActivity(1, function (data) {
res.send(data);
});
});我很可能在这个报告中包含更多的查询,从而有更多的嵌套回调。我有什么办法可以避免这种情况呢?我很熟悉承诺等,但是node没有内置的任何东西来清理这些东西。也许我用错了?
最后,我要从路线上发出一个“已完成”的回传。也许这是节点的方式,但如果我只需要返回生成的报告,而不需要回调,那就太好了。有更好的模式吗?
任何帮助都很感激!
发布于 2014-01-03 16:25:04
我有一个构建在节点上的报表引擎,它具有相同的多个查询问题。为了保持思想的整洁,我使用异步,这是一个很棒的控制流库:https://github.com/caolan/async#series
您将需要查看async.series。它使您的代码比大量的嵌入式函数稍微干净一些。
注意:您需要创建一个对您需要访问的变量的引用,从一个步骤访问到async.series上下文之外的下一个步骤。对于exaple,我在函数中对两个变量使用var 1:
//keep context to shared values outside of the async function
var one,
two;
async.series([
function(callback){
// do some stuff ...
one = 'one';
callback(null, one);
},
function(callback){
//!access value from previous step
two = one + one;
callback(null, two);
}
],
// optional callback
function(err, results){
// results is now equal to ['one', 'oneone']
});https://stackoverflow.com/questions/20907211
复制相似问题