我只使用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
操作后得到响应。
答案 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();
});
});