Node.js Обещание с мангустом - PullRequest
0 голосов
/ 04 сентября 2018

Мне сложно использовать 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);
    })
}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Избегайте Promise.resolve, избегайте использования конструктора new Promise, например Promise.resolve, избегайте 1007 * конструктора antipattern * и избегайте forEach и не забудьте return цепочку обещаний из вашей функции:

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);
    })
}
0 голосов
/ 04 сентября 2018

У вас проблема с 3-м .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);
        })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...