【问题标题】:resolving a promise using mongodb and nodejs使用 mongodb 和 nodejs 解决承诺
【发布时间】:2017-08-01 11:12:24
【问题描述】:

您好,我是 nodejs 和 mongodb 的新手,在解决第二个承诺后,我无法解决我的第一个承诺。解决后我可以看到我的第二个承诺的结果。这是我的代码

 var getShows = function () {

    return new Promise(function (resolve, reject) {

    usersdb.find(function (err, result) {
        if(err) return console.error(err);

        var usersFromCall = result;

        var task = function (users) {
            return new Promise(function (resolve, reject) {

                var user = {
                    'name': '',
                    'pages': []
                }

                user.name = users.show;
                console.log(users);

                pagedb.find({'show' : user.name}, function (err, resp) {

                    for(var j = 0 ; j <resp.length; j ++){
                        var pages = { 'pageId': ''};
                        pages.pageId = resp[j].pageId;

                        user.pages.push(pages);
                    }
                    console.log(user);

                    resolve({show: user});
                })

            });

        };

        var actions = usersFromCall.map(task);
        return Promise.all(actions);
    }).then(function () {
        resolve()
    })
 });

};

在 find 之后,我是否在 then 函数中解析第一个承诺?

【问题讨论】:

  • 如果你的代码没有导致错误,这意味着usersdb.find正在返回一个promise,这意味着你需要避免promise constructor anti pattern

标签: node.js mongodb promise


【解决方案1】:

以下应该有效:

var getShows = function () {

    return new Promise(function (resolve, reject) {

        usersdb.find(function (err, users) {
            if (err) return console.error(err);

            var task = function (user) {
                return new Promise(/* ... */);
            };

            var actions = users.map(task);
            Promise.all(actions).then(resolve, reject);
        });

    });

};

getShows().then(function (results) {
    // Prints the result of each task as an array
    console.log(results);
});

【讨论】:

  • 如果我这样做,它会在第一次查找后解决,而我在第二次查找后没有得到值
  • @inhaler 我想我知道是什么原因造成的,我已经改变了答案。请让我知道它是否有效:)
【解决方案2】:

查看您的代码,.find 似乎返回了一个 Promise。所以,为了避免 Promise 构造函数反模式,请尝试以下,我相信它会产生正确的结果

var getShows = function() {
    return usersdb.find()
    .then(result => 
        Promise.all(result.map(
            users => 
                pagedb.find({
                    show: users.show
                })
                .then(resp => ({
                    show: {
                        name: users.show,
                        pages: resp.map(item => ({pageId: item.pageId}))
                    }
                }))
            )
        )
    );
};

或 ES5 版本

var getShows = function getShows() {
    return usersdb.find().then(function (result) {
        return Promise.all(result.map(function (users) {
            return pagedb.find({
                show: users.show
            }).then(function (resp) {
                return {
                    show: {
                        name: users.show,
                        pages: resp.map(function (item) {
                            return { pageId: item.pageId };
                        })
                    }
                };
            });
        }));
    });
};

【讨论】:

  • 感谢@Jaromanda X。这似乎是正确的做事方式!我一定会保留它以供参考。
猜你喜欢
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2021-11-04
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多