如何解决Async 和 promise 函数在 res.json 调用中不显示任何内容
我在 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);
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。