Node.js如何进行条件回调?

时间:2016-07-15 13:11:24

标签: javascript node.js

我仍在努力使用Node.js的嵌套回调结构。我看起来像异步,合作和其他方法,但它们似乎没有帮助。

关于如何编码的最佳做法是什么,例如

var db = MongoClient.connect(url, callback1 () {
   if (auth) }
      db.authenticate(user, pswd, callback2 () {
      --- should continue with db.collection.find (authenticated)
   )
   --- should continue with db.collection.find (non-authenticated)
}

所以问题是:我应该如何对此序列进行编码,以便能够在db.connect或db.authenticate之后执行db调用(并且两个回调都已完成)?我能想到的唯一方法是在单独的函数中进行以下db调用,并在两个回调例程中调用此函数。不是很优雅......

2 个答案:

答案 0 :(得分:1)

如果你感到困惑的是如何在回调之前放置optionnal条件,你可以使用async:

var async = require('async');

var db = MongoClient.connect(url, () => {
    async.series([
        (callback) => {
            //Branching
            if(auth) {
                // Do conditionnal execution
                db.authenticate(user, pswd, () => {
                    callback();
                });
            } else {
                // Skip to the next step
                callback();
            }
        },
        (callback) => {
            // Whatever happenned in the previous function, we get here and can call the db
            db.collection.find();
        }
    ]);
});

答案 1 :(得分:0)

我不确定我完全理解你在问什么,顺便说一句,如果你想根据某些条件运行回调(例如:要求或不要认证)......你可以使用承诺:



var db = MongoClient.connect(url, callback1 () {
   if (auth) }
      db.authenticate(user, pswd, callback2 () {
      --- should continue with db.collection.find (authenticated)
   )
   --- should continue with db.collection.find (non-authenticated)
}

var MongoClientConnect = (url, username, password) => new Promise((resolve, reject) => {
  
  var db = MongoClient
    .connect(url, () => {
      if(!requiresAuthentication) {
        return resolve(db);    
      }
  
      db.authenticate(username, password, () => {
        //check if login success and
        resolve(db);
      });
    })
  ;
});

// THEN
MongoClientConnect()
  .then(db => db.collection.find("bla bla bla"))
;