Looking for suggestion using Promise

60 views
Skip to first unread message

Ashutosh Das

unread,
Nov 8, 2015, 1:08:56 PM11/8/15
to nodejs
I am using Mongoose with Bluebird library . Here is my code:

router.route('/:name')
        
.get(function (req, res) {
                
var values = [];
                 
Tag.findOneAsync({'name': req.params.name}, {urlId: 1, _id: 0}).then(function (data) {
                    data
['urlId'].forEach(function (urlId) {
                        
Urls.findByIdAsync(urlId).then(function (result) {
                            values
.push(result);
                        
}).catch(function (err) {
                            res
.status(500).send(err);
                        
});
                    
});
                
}).catch(function (err) {
                    res
.status(500).send(err);
                
});

                res
.send(values);
     
});

Currently I am gettings empty 'values' array . My question is, how to organize this code , so that I can get response after 'values.push()' operation ?

Aria Stewart

unread,
Nov 8, 2015, 1:25:25 PM11/8/15
to nod...@googlegroups.com
You're making an empty array, starting the find, then sending the array, then later, filling the array.

You'd move the res.send into the promise chain -- let me suggest a rewrite here:

router.route('/:name').get(function (req, res) {

Tag.findOneAsync({'name': req.params.name}, {urlId: 1, _id: 0}).then(function (data) {
         return Promise.all(data['urlId'].map(function (urlId) {
                        return Urls.findByIdAsync(urlId)
})
}).then(function (values) {
res.send(values);
}, function (err) {
                res.status(500).send(err);
});
});

It's nice to think of 'then' as a singular 'map' -- take this value, and transform it into that value (or a promise of a value or values)

Promise.all resolves a whole array of promises like that set of results of findByIdAsync.

Aria
Reply all
Reply to author
Forward
0 new messages