簡體   English   中英

Node.js異步模塊問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM