蓝鸟宣传猫鼬

时间:2015-11-09 02:16:12

标签: node.js express mongoose

我只使用Bluebird几天,但我很困惑。这是我正在处理的代码:

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

在此代码中,响应为空values。所以我试着用这种方式组织代码:

router.route('/:name')
        .get(function (req, res) {
            var  prom = new Promise(function(resolve, reject) {
                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) {
                            reject(err);
                        });
                    });
                }).catch(function (err) {
                    reject(err);
                });
                resolve(values);
            });
            prom.then(function (values) {
                res.send(values);
            });

结果仍然相同。那么如何组织代码,以便在完成data['urlId'].forEach操作后得到响应。

1 个答案:

答案 0 :(得分:2)

看我的评论。你应该做更多类似的事情。因为你已经宣传了mongoose,所以async方法已经返回promises,所以你不需要创建一个新的promise来解决或拒绝它们。你还需要在then语句中返回任何返回promise的代码。

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

或更清楚地使用promise.map

var mongoose = require( 'mongoose' );
var Promise = require('bluebird');
Promise.promisifyAll( mongoose );

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