使用mongodb和nodejs解决一个承诺

时间:2017-03-11 00:01:59

标签: node.js mongodb promise

您好我是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函数中的第一个promise吗?

2 个答案:

答案 0 :(得分:2)

以下内容应该有效:

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);
});

答案 1 :(得分:1)

查看代码,似乎.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 };
                        })
                    }
                };
            });
        }));
    });
};