2013-10-30 129 views
1

我想使用異步模塊來削減特定於Node.js的'回調地獄'。基本上,我試圖使用async.series從數據庫中檢索一些信息並將其顯示在我的視圖中。儘管如此,我認爲沒有結果。Node.js異步模塊問題

這是我到目前爲止的代碼:我首先要查詢郎模型(MongoDB的),找到匹配req.query.keyword這些記錄

// 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 }); 
      } 
     ); 
    } 

。之後,我想查詢人體模型並找到所有具有該特定語言技能的人類。此外,FOR循環意味着消除我的數組中的重複項,因爲人可能有多種語言。

回答

0

如果我正確理解您的代碼,則可能需要使用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沒有維持秩序和this answer表明,使用$or會,嘗試以此作爲第二個查詢的選擇:

... 
    function(langs, done) { 
    var query = langs.map(function(lang) { 
     return { _id : lang.human }; 
    }); 

    Human 
     .find({ $or : query }) 
     .exec(done); 
    } 
    ... 
+0

剛試過你的代碼,它完美的作品!儘管如此,順序降序函數是因爲我希望結果以降序的語言技能爲基礎返回。因此,例如,如果我有兩個英語技能爲5和10的人,我希望具有10的人成爲搜索結果列表中的第一個人。該片段按照發現它們的順序返回人類列表。 –

+0

@shinpou如果訂單正在導入,我不完全確定是否使用'$ in'會保持訂購。所以請測試:) – robertklep

+0

我試過了,順序是不是我正在尋找的:(但仍然!我得到正確的結果回!非常感謝!仍然,你可以指向我在某個方向文檔)或解釋完成的回調函數,它是否簡單地集成在瀑布函數中,並用於將參數傳遞給下一個函數? –