【问题标题】:Node.js Promise with mongooseNode.js Promise 与猫鼬
【发布时间】:2019-02-09 10:24:11
【问题描述】:

我在使用 Promise 时遇到了困难。
我想从 mongodb 中的另一个表中获取数据。
但我陷入了回调地狱,所以我试图解决这个问题,但我做不到。
我该怎么办?结果是“未定义”。

非常感谢,

let mongoose         = require('mongoose');
mongoose.Promise     = global.Promise;

....

exports.Recommend = (id) => {
    User.find({User_id: myId})
        .then((result) => {
            return Promise.resolve(result[0].age)
        }).then(age => {
        return new Promise((resolve,rejject)=>{
            resolve(User.find()
                .select('User_id')
                .where('age').equals(age))
            })
        }).then((Users_id) => {
            Users_id.forEach((user, idx, arr) => {
                Count.find()
                 .select('board_id')
                 .where('User_id').equals(user.User_id)
                 .exec((err, items) => {
                     return new Promise((resolve,reject)=>{
                         resolve(
                             items.forEach((post, idx, arr) => {
                             posts.push(post.board_id)
                         }))
                     })
                })
        })
    }).then(()=>{
        console.log("posts:"+posts);
    })
}

【问题讨论】:

  • 不要在then 中创建新的承诺!猫鼬会回报承诺!就做return User.find()…
  • 喜欢这个? " 返回结果[0].age "
  • 是的。 Promise.resolve 创建一个立即解决的承诺...

标签: javascript node.js mongodb mongoose promise


【解决方案1】:

Avoid Promise.resolve,避免使用new Promise 构造函数,如Promise.resolve,避免使用Promise constructor antipatternavoid forEach,不要忘记return 函数中的promise 链:

exports.Recommend = (id) => {
    return User.find({User_id: myId}).then(result => {
        return User.find()
            .select('User_id')
            .where('age')
            .equals(result[0].age));
    }).then(user_ids => {
        return Promise.all(user_ids.map((user, idx, arr) => {
            return Count.find()
                 .select('board_id')
                 .where('User_id').equals(user.User_id)
                 .exec()
                 .then(posts => posts.map(post => post.board_id));
        }));
    }).then(board_ids => {
        console.log("posts:"+board_ids);
    })
}

【讨论】:

  • 这(显然)是正确的想法,但 Mongo 查询本身是错误的 - 这是查找所有相同年龄用户的帖子的非常慢的方法。见.populate()
【解决方案2】:

您遇到了第三个.then 的问题,我建议您使用Promise.all 函数来运行并行数据库查询。以下示例可能对您有所帮助

exports.Recommend = (id) => {
    User.find({
            User_id: myId
        })
        .then((result) => {
            return User.find()
                .select('User_id')
                .where('age').equals(result[0].age)
        }).then((Users_id) => {
            return Promise.all(Users_id.map((user, idx, arr) => {
                return Count.find()
                    .select('board_id')
                    .where('User_id').equals(user.User_id)
            }));
        }).then((Users_id) => {
            Users_id.forEach(items => {
                items.forEach(post => {
                    posts.push(post.board_id)
                })
            })
        }).then(() => {
            console.log("posts:" + posts);
        })
}

【讨论】:

    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2012-08-12
    • 2013-12-03
    • 1970-01-01
    • 2015-10-23
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多