微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Async 和 promise 函数在 res.json 调用中不显示任何内容

如何解决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 举报,一经查实,本站将立刻删除。