问题描述
我在 javascript 中有一个控制器,它应该获取给定的用户,然后获取与用户关联的宠物。相关的宠物存储在用户架构内的对象引用数组中。目前,当我尝试 res.json 包含相关宠物的结果数组时,它输出为空数组“[]”。遵循 Mozilla 文档和教程,我尝试在此函数上实现承诺,以解决我之前的 res.json 输出空数组问题。我不确定我哪里出错了,因为我是 JS/express/node/mongo 的新手
问题代码:
export const getPetsForAUser = (req,res)=>
{
function getter(){
return new Promise(resolve =>{
User.findOne({_id: req.params._id},(err,users) =>{
let petlist = users.pets;
for(var i = 0; i < petlist.length; i++){
Pet.findOne({_id:petlist[i]},pet) =>{
var t = pet
return Promise.resolve(t)
});
}
})
});
}
async function asyncCall(){
const result = await getter();
res.json(result);
}
asyncCall();
};
解决方法
您可以在代码中实现这样的承诺:
export const getPetsForAUser = (req,res) => {
return new Promise((resolve,reject) =>{
User.findOne({_id: req.params._id},(err,users) => {
if (err) reject(err);
let petlist = users.pets;
for(var i = 0; i < petlist.length; i++) {
Pet.findOne({_id:petlist[i]},pet) =>{
if (err) reject(err);
var t = pet
resolve(t)
});
}
})
,
使用 Aync/Await 和 Promise all
export default async (req,res) => {
const promises = [];
let result = null;
const petlist = await new Promise((resolve,reject) => {
User.findOne({ _id: req.params._id },users) => {
if (err) {
reject(err);
} else {
resolve(users.pets);
}
});
});
if (petlist && petlist.length) {
for (let i = 0; i < petlist.length; i++) {
// eslint-disable-next-line no-loop-func
const promise = new Promise((resolve,reject) => {
Pet.findOne({ _id: petlist[i] },pet) => {
if (err) {
reject(err);
} else {
resolve(pet);
}
});
});
promises.push(promise);
}
result = await Promise.all(promises).then((data) => {
console.log('all promises resolved!');
console.log(data);
return data;
});
}
console.log(result);
};