javascript - 避免 Node 中的回调 hell

标签 javascript node.js express asynchronous

我有这个功能

/* GET main page */
router.get('/', (req, res, next) => {
    Account.find({accType: 'Employer'}, (err, col) => {
        if (err) {
            console.log(err);
        } else {
            Banner.findOne((err, banner) => {
                if (err) {
                    console.log(err);
                } else {
                    // Determine whether there is at least one awaiting account.
                    Account.findOne({accType: 'Awaiting'}, (err, doc) => {
                            if (err) {
                                console.log(err);
                            } else {
                                if (doc != null) {
                                    var awaiting = true;
                                }
                                console.log(doc);
                                res.render('admin/', {
                                    title: 'Admin pannel',
                                    user: req.user,
                                    employers: col,
                                    areAwaiting: awaiting,
                                    banner: banner,
                                )
                            }
                        }
                    );
                }
            });
        }
    });
});

我尝试使用 async像这样的模块:

async.parallel(calls, (err, col) => {
    if (err)
        console.log(err);
    else {
        console.log(col);
        res.render('admin/', {
            title: 'Admin pannel',
            user: req.user,
            employers: col[0],
            banner: col[1],
            areAwaiting: col[2],
        })
    }
});

现在。我得到的错误是 wrapAsync(...) is not a function .我尝试将我的函数放在这样的匿名函数中:

() => {
    Account.find({accType: 'Employer'}, (err, col) => {
        if (err)
            console.log(err);
        else return col;
    })
}

但随后代码就卡住了。我也试过这个:

(col) => {
    Banner.findOne((err, doc) => {
        if (err)
            console.log(err);
        else return doc;
    });
    return col
},

但是效果是一样的。知道我做错了什么吗?回调 hell 版本有效,但丑陋且不可维护。

Dave Meehan 的回答。必须对其稍作编辑才能使其正常工作。

router.get('/', (req, res) => {
    return Promise.all([
        Account.find(),
        Banner.findOne(),
        Account.findOne({accType: 'Awaiting'}),
    ]).then(([employers, banner, awaiting]) => { // Right here
        if (awaiting != null)
            var areAwaiting = true;
        res.render('admin/', {
            title: 'Admin pannel',
            user: req.user,
            employers: employers,
            areAwaiting: areAwaiting,
            banner: banner,
        });
    }).catch(e => {
        console.error(e)
    });
});

我必须在 then 中关闭数组到 ()

最佳答案

这很简单,并假设:

  1. 你正在使用 Express 或类似的路由处理程序,你可以返回一个 promise 而不是使用回调

  2. 您正在使用 Mongoose 或类似的数据库,并且可以返回一个 promise 而不是使用回调。

检查您的版本以获取 Promise 支持。

您似乎至少缺少 Banner 的一些查询参数,并且您需要弄清楚其中是否存在依赖关系,或者如图所示,它们是否可以并行运行。

router.get('/', (req, res) => {
  return Promise.all([
    Account.find(),
    Banner.findOne(),
    Account.findOne({ accType: 'Awaiting' }),
  ]).then(([ col, banner, doc ]) => {
    res.render('admin/', {
      title: 'Admin pannel',
      user: req.user,
      employers: col,
      areAwaiting: awaiting,
      banner: banner,
    );
  }).catch(e => { console.error(e) });
});

关于javascript - 避免 Node 中的回调 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49603355/

相关文章:

javascript - d3 过滤后无法附加完整数据

javascript - Nightmare.js 在 Ubuntu Linux 云服务器上没有按预期工作

javascript - 如何使用 http post Node.js 下载文件

node.js - 让 webpack 热更新在我的同构网络应用程序中正常工作

javascript - 如何检查 session 对象是否包含任何对象?

javascript - 使用 React State 和 UseEffect 控制输入字段焦点

javascript - snapshot.docChanges() 在 Firebase Firestore 中不起作用

javascript - 根据计数打破 Object.keys 循环

javascript - async.each 有问题,回调在完成任务之前被调用

node.js - 使用 Express 进行重定向和渲染