我仍在努力使用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调用,并在两个回调例程中调用此函数。不是很优雅......
答案 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"))
;