не может получить предметы. он возвращает []. но он отображается правильно в console.info (элемент). Я думаю, что до того, как моя карта () будет завершена. он распечатывает все данные. как решить эту проблему. Я новичок в узле.
function getBlockUsers() {
return new Promise(function (resolve, reject) {
BlockUser.find({userId:req.user._id}).populate("blockedId").lean().exec(function (err,result) {
if (err){
reject({"msg":"failed to getting block user."})
}else{
var results = [];
result.map(function(item){
Vehicle.findOne({userId:item.blockedId}).lean().exec(function(err,vehicle){
if (vehicle){
item.vehicleId = vehicle._id;
item.vehicleModel = vehicle.model;
}
results.push(item)
console.info(item)
});
});
resolve(results);
}
})
});
}
внутри вашей карты есть aysnc. stackoverflow.com/questions/33438158/…





Проблема в том, что у вас есть неблокирующий код внутри вашего result.map ().
Вам следует попробовать использовать только один запрос к БД. Затем разрешите все элементы в обратном вызове exec. В противном случае используйте обещание для исходного запроса.
Vehicle.find({ $in: { userId: result.map( item => item.blockedId) }}).lean().exec( (err, results) => {
// add the vehicle / model ids to each item in results
resolve(results)
})
Поскольку вы используете асинхронную функцию в желаемой функции карты, вам необходимо создать массив обещаний и использовать Promise.all до разрешения дождаться всех результатов.
Приведенный ниже код должен исправить вашу проблему.
function getBlockUsers() {
return new Promise(function (resolve, reject) {
BlockUser.find({userId:req.user._id}).populate("blockedId").lean().exec(function (err,result) {
if (err){
reject({"msg":"failed to getting block user."})
}else{
var results = result.map(function(item){
// don't forget to return in the map function
return new Promise(function (resolve1, reject1) {
Vehicle.findOne({userId:item.blockedId}).lean().exec(function(err,vehicle){
if (err) return reject1(err)
if (vehicle) {
item.vehicleId = vehicle._id;
item.vehicleModel = vehicle.model;
}
resolve1(item)
});
})
});
// here you wait all the promises of results
resolve(Promise.all(results));
}
})
});
}
map возвращает сопоставленный элемент для каждого результата. Похоже, вам нужно просто перебрать элементы результата.