NodeJs Mongoose如何从" find()。然后"中获取数据?在" find()。然后"?

时间:2015-07-20 20:38:13

标签: node.js mongodb mongoose

对不起我的标题,我不知道我能放什么。

请帮助我,我想打印来自"然后"在"然后"吗

谢谢

models.book.find()
  .then( function (content) {
    var i = 0;

    while (content[i]) {
      models.author.findOne({"_id": content[i].author_id}, function(err, data) {
        console.log(data); //here, it' good
        content[i] = data;

        MY_DATA = content;

        return MY_DATA;
      });

      i++;
    };
  })
  .then(function (result) {
    console.log(result); // here I would like to print MY_DATA
  });

1 个答案:

答案 0 :(得分:1)

您的代码存在许多问题,我并不认为它的行为符合您的预期。

Chaining Promises

为了有效地将承诺链接到您的预期,每个承诺回调都需要返回另一个承诺。这是一个例子,你的情况稍有改变。

var promise = models.book.find().exec(); // This returns a promise
// Let's hook into the promise returned from 
var promise2 = promise.then( function (books) {
  // Let's only get the author for the first book for simplicity sake
  return models.author.findOne({ "_id": books[0].author_id }).exec(); 
});

promise2.then( function (author) {
  // Do something with the author
});

在您的示例中,您没有通过回调返回任何内容(return MY_DATA正在models.author.findOne回调中返回,因此没有任何反应),因此它的行为不像您和#39;期待它。

model.author.findOne是异步的

model.author.findOne是异步的,所以你不能期望在回调中多次调用它而不是异步处理它们。

// This code will return an empty array
models.book.find( function (err, books) {
  var i = 0, results = [];

  while (books[i]) {
    models.author.findOne({ "_id": books[i].author_id}, function (err, data) {
      // This will get called long after results is returned
      results.push(data);
    });

    i++;
  };

  return results; // Returns an empty array
});

处理多个承诺

Mongoose使用mpromise,而且我没有看到一起处理多个承诺的方法,但这可以用来完成你的案例。

var Promise = require('mpromise');

models.book.find().exec()
  .then( function (books) {
    var i = 0,
        count = 0,
        promise = new Promise(),
        results = [];

    while (books[i]) {
      models.author.findOne({ "_id": books[i].author_id }, function (err, author) {
        results.push(author);
        count++;
        // Keep doing this until you get to the last one
        if (count === books.length) {
          // Fulfill the promise to get to the next then
          return promise.fulfill(results);
        }
        return;
      });
    }

    return promise;
  })
  .then( function (results) {
    // Do something with results
  });

我不知道这是否会像现在一样工作,但它应该让你知道需要做些什么。