首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理NodeJS和sqlit-3中的深度嵌套回调?

如何处理NodeJS和sqlit-3中的深度嵌套回调?
EN

Stack Overflow用户
提问于 2014-01-03 15:35:56
回答 1查看 1.1K关注 0票数 2

我一直在处理节点和节点-sqlite3 3,并且需要基于许多查询构建一个报告:

代码语言:javascript
复制
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响应。以下是我的路线:

代码语言:javascript
复制
app.get('/api/hello',
  auth.check,
  function(req, res) {
    hello.getActivity(1, function (data) {
      res.send(data);
    });
  });

我很可能在这个报告中包含更多的查询,从而有更多的嵌套回调。我有什么办法可以避免这种情况呢?我很熟悉承诺等,但是node没有内置的任何东西来清理这些东西。也许我用错了?

最后,我要从路线上发出一个“已完成”的回传。也许这是节点的方式,但如果我只需要返回生成的报告,而不需要回调,那就太好了。有更好的模式吗?

任何帮助都很感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-03 16:25:04

我有一个构建在节点上的报表引擎,它具有相同的多个查询问题。为了保持思想的整洁,我使用异步,这是一个很棒的控制流库:https://github.com/caolan/async#series

您将需要查看async.series。它使您的代码比大量的嵌入式函数稍微干净一些。

注意:您需要创建一个对您需要访问的变量的引用,从一个步骤访问到async.series上下文之外的下一个步骤。对于exaple,我在函数中对两个变量使用var 1:

代码语言:javascript
复制
//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']
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20907211

复制
相关文章

相似问题

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