对不起我的标题,我不知道我能放什么。
请帮助我,我想打印来自"然后"在"然后"吗
谢谢
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
});
答案 0 :(得分:1)
您的代码存在许多问题,我并不认为它的行为符合您的预期。
为了有效地将承诺链接到您的预期,每个承诺回调都需要返回另一个承诺。这是一个例子,你的情况稍有改变。
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
});
我不知道这是否会像现在一样工作,但它应该让你知道需要做些什么。