2016-07-15 55 views
0

我仍在努力使用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) 
} 

所以,問題IST:我應該如何編寫這個序列,以便能夠執行來電分貝以下db.connect或db.authenticate(兩者回調完成)?我能想到的唯一方法是在一個單獨的函數中使用以下db調用,並在兩個回調例程中調用此函數。不是真的...優雅

+0

你需要用不同的參數調用'db.collection.find'嗎?或者只是等待'db.authenticate'的回調,然後才能開始查找,如果'auth'是完全錯誤的? – DrakaSAN

+0

另外,什麼是「認證」和「無認證」的變量? – DrakaSAN

+0

對數據庫使用基於承諾的接口,然後可以使用承諾進行異步流量控制。 – jfriend00

回答

1

如果你被迷惑的是如何把optionnal條件回調之前,使用異步你可以這樣做:

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(); 
     } 
    ]); 
}); 
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")) 
 
;