【发布时间】:2015-11-09 11:16:18
【问题描述】:
我只使用了几天的 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 操作后得到响应。
【问题讨论】:
-
您可以尝试在第二个示例中的第一个函数末尾添加一个返回,以便在解决它后返回承诺吗?你可能不会退回它。
-
如果你对模块进行承诺,异步方法已经返回承诺对象,所以你不需要手动创建承诺。此外,在 then 语句中使用 promise 时,您需要返回它