所以我有这个异步问题,其中我使用async eachSeries迭代,在mongoose中使用findById,然后调用findById中的函数...
问题是,我无法弄清楚如何在将函数调用推入数组之前让函数调用解析,最后我将使用items_results等于未定义的数组。
我是异步和承诺的新手,所以这可能是一团糟。
var user = req.user;
var user_items = req.user.items;
var item_results = [];
var queue = Promise.resolve();
var promises = [];
var my_iterator = function(user_item_id, callback) {
Item.findById(user_item_id, function(err, user_item) {
queue.then(function() {
return outside_function(user, user_item, null, false);
});
promises.push(queue);
callback();
});
};
var result = function() {
var items_object = {
type: 'success',
items: item_results
};
res.status(200).send(items_object);
};
async.eachSeries(user_items, my_iterator, function(err) {
Promise.all(promises).then(function (results) {
item_results.push(results);
result();
});
});
答案 0 :(得分:0)
您应该在Mongo数据库中使用Promise.promisify
或Promise.promisifyAll
Promise.promisifyAll(Items);
Items.findByIdAsync(user_item_id)
.then(function (user_item) {
res.status(200).send({
type: 'success',
item: user_items
});
})
.catch(function (error) {
console.warn(error.code);
});
答案 1 :(得分:0)
这就是我要用的东西。
首先,让猫鼬与蓝鸟一起玩。
var Promise = require('bluebird');
var mongoose = require('mongoose');
Promise.promisifyAll(mongoose.Model);
Promise.promisifyAll(mongoose.Model.prototype);
Promise.promisifyAll(mongoose.Query.prototype);
接下来,将项目ID 的数组映射到项目承诺的数组,并使用.all()
等待,直到该数组中的所有待处理项目承诺结算
function middleware(req, res) {
var pendingItems = Promise.resolve(req.user.items).map(function (id) {
return Item.findByIdAsync(id);
});
return pendingItems.all().then(function (items) {
res.status(200).send({
type: 'success',
items: items
});
}).catch(function (error) {
res.status(200).send({
type: 'failure',
error: error
});
});
});