簡體   English   中英

使用mongodb和nodejs解決一個承諾

[英]resolving a promise using mongodb and nodejs

您好我是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()
    })
 });

};

在查找之后我在then函數中解決第一個承諾嗎?

以下應該有效:

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

看看你的代碼,似乎.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 };
                        })
                    }
                };
            });
        }));
    });
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM