[英]Node.js async module issue
我正在嘗試使用異步模塊來減少特定於Node.js的“回調地獄”。 基本上,我試圖使用async.series
從數據庫中檢索一些信息並將其顯示在我的視圖中。 不過,我認為沒有任何結果。
這是我到目前為止的代碼:
// Search
exports.search = function(req, res) {
var x = [];
async.series([
function(cb) {
Lang.find({ lang: req.query.keyword }).sort({ verbal: -1 }).exec(function(err, langs) {
cb(null, langs);
});
},
function(cb) {
Human.find({}, function(err, humans) {
cb(null, humans);
});
}],
function(err, results) {
if (err) {
res.send(500);
}
for(var i = 0; i < results[0].length; i++) {
for(var j = 0; j < results[1].length; j++) {
if(results[1][j]._id == results[0][i].human) {
x.push(results[1][j]);
}
}
}
res.render('myView', { title: 'Search Results', humans: x });
}
);
}
我首先要查詢Lang模型(MongoDB),並找到與req.query.keyword
匹配的記錄。 之后,我想查詢人類模型,並找到所有具有特定語言技能的人類。 另外,FOR循環的目的是消除陣列中的重復項,因為人類可能有幾種語言。
如果我正確理解您的代碼,則可能要改用async.waterfall
。 它將一個函數的結果作為參數傳遞給下一個。 還可以進行其他一些優化:
async.waterfall([
function(done) {
Lang
.find({ lang: req.query.keyword })
.sort({ verbal: -1 }) // (not really useful)
.select('human') // not strictly necessary, but saves a bit of space
.exec(done); // short for :
// .exec(function(err, results) {
// done(err, results);
// });
},
function(langs, done) {
// extract the 'human' property from each result
var _ids = langs.map(function(lang) {
return lang.human;
});
// perform a query finding all humans in the list of ids
Human
.find({ _id : { $in : _ids } })
.exec(done);
}
], function(err, humans) {
if (err)
return res.send(500);
res.render('myView', {
title : 'Search Results',
humans: humans
});
});
編輯:因為$in
不會保留順序,並且此答案建議使用$or
,請嘗試將其作為第二個查詢的替代方法:
...
function(langs, done) {
var query = langs.map(function(lang) {
return { _id : lang.human };
});
Human
.find({ $or : query })
.exec(done);
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.