您想使用Promise.all() 等待两个查询都完成。
当然你需要在它里面有promise,所以我们把你的两个函数都包装在一个promise中,当回调被调用时就会实现。
如果两个查询之一失败,那么Promise.all() 也会失败,我们会将错误发送回客户端。
为了分隔回复中的数据,我将数据拆分为两个字段,count 和 find。通过这种方式,您可以轻松地从 angularjs 中读取它们并根据需要使用它们
app.get('/projects/:company_id', function(req, res){
var company_id = req.params.company_id;
Promise.all(
new Promise(resolve, reject) {
db.projects.count({"company_id": company_id },function(err, doc){
if (err) return reject(err);
resolve(doc);
});
},
new Promise(resolve, reject) {
db.projects.find({"company_id": company_id },function(err, doc){
if (err) return reject(err);
resolve(doc);
});
}
)
.then(data) {
res.json({
"count": data[0],
"find": data[1]
});
}
.catch(error) {
res.json({
"error": error
});
}
});
如果由于使用的是 node.js 0.10.x 而无法使用 Promises,则可以执行以下操作:
app.get('/projects/:company_id', function(req, res){
var company_id = req.params.company_id;
var reply = {
find: -1,
count: -1
}
var errorSent = false;
function sendErr(e) {
if (errorSent) return; // Do not send twice a reply
res.json({"error": e});
errorSent = 1;
}
function sendWhenReady() {
if (reply.count !== -1 && reply.find !== -1) res.send(reply);
}
//query1
db.projects.count({"company_id": company_id },function(err, doc){
if (err) return sendError(err);
reply.count = doc;
sendWhenReady();
});
//query2
db.projects.find({"company_id": company_id },function(err, doc){
if (err) return sendError(err);
reply.find = doc;
sendWhenReady();
});
});