我在写一个后台,封装了两个方法去查询数据库,它们的返回都是Promise,调用它们都有正确的结果。
function list(req, res, next) {
let start = req.query.start;
let count = req.query.count;
exchangeDb.queryList(start, count).then(results => {
res.json(results)
}).catch(err => {
throw err;
});
}
function load(req, res, next, name) {
let limit = req.query.limit;
exchangeDb.queryVolume(name, limit).then(results => {
req.results = util.convert(results);
return next();
}).catch(err => {
throw err;
});
}
第一个返回的是列表,第二个是返回详情。我想把它们合为一个方法,尝试这样做:
function list(req, res, next) {
let start = req.query.start;
let count = req.query.count;
exchangeDb.queryList(start, count).then(results => {
results.forEach((index,element) => {
exchangeDb.queryVolume(element.name,50).then(volume => {
element.volume = volume;
results[index] = element;
})
});
res.json(results)
}).catch(err => {
throw err;
});
}
显然,它不能工作,我被这个问题深深的困扰了,如果是链式的Promise,then().then()看上去也不能解决这个问题,请大家帮忙看一下,谢谢。
看起来你是想先取集合,再取集合中每个元素的详情。这个时候,由于取详情的操作也是异步操作,所以你不能直接用
forEach
,通常来说,你有Promise.all
和连接成队列两种做法。Promise.all
如果并发压力大的话,也可以用队列:
我之前做过一次讲堂:Promise 的 N 种用法,对 Promise 的讲解比较详细,尤其介绍过几种队列的方式,建议你看一下。