我有三个MongoDB函数,用于返回不同的集合。
// mongo DB models/user
module.exports.countUsers = function (callback) {
User.findOne().where({ 'status': 1}).count(callback);
}
// mongo DB models/Cars
module.exports.countCars = function (callback) {
Car.findOne().where({ 'status': 1}).count(callback);
}
// mongo DB models/orders
module.exports.countOrders = function (callback) {
Order.findOne().where({ 'status': 1}).count(callback);
}
我需要将所有这些数据合并到一个GET API调用中。
User = require('./models/user');
Cars = require('./models/cars');
Orders = require('./models/orders');
app.get('/userInfo', function(req, res) {
let outPut = {}
//get data from mongo db
User.countUsers(function(err, count) {
//A
console.log(count);
outPut.coutUsers = count;
});
Cars.countCars(function(err, count) {
//B
console.log(count);
outPut.coutCars = count;
});
Orders.countOrders(function(err, count) {
//C
console.log(count);
outPut.coutOrders = count;
});
res.status(200);
res.json(outPut);
});
在收集之前,必须将数据分配给打击对象。
outPut.coutUsers = '';
outPut.coutCars = '';
outPut.coutOrders = '';
我尝试了几种方法,但是没有运气。
它总是返回{}
,但是我需要类似{coutUsers:10,countCars:10,countOrders :10}
谢谢。
答案 0 :(得分:0)
欢迎来到地狱(callback hell
)。如果您更喜欢回调样式,则可以使用async library,它具有parallel
函数,该函数将帮助您完成任务。
或者您可以将函数转换为Promise,然后可以通过Promise语法或async/await
语法(推荐)使用它们。
什么是回调地狱?
User = require('./models/user');
Cars = require('./models/cars');
Orders = require('./models/orders');
app.get('/userInfo', function (req, res) {
let outPut = {}
//get data from mongo db
User.countUsers(function (err, count) {
//A
console.log(count);
outPut.coutUsers = count;
Cars.countCars(function (err, count) {
//B
console.log(count);
outPut.coutCars = count;
Orders.countOrders(function (err, count) {
//C
console.log(count);
outPut.coutOrders = count;
res.status(200);
res.json(outPut);
});
});
});
});
如果您使用的nodejs版本大于等于8.15的节点,则可以使用util.promisify
将回调函数转换为Promise,然后可以将它们与Promise语法或async/await
语法一起使用。
const promisify = require('util').promisify;
app.get('/userInfo', async function (req, res) {
//get data from mongo db
let coutUsersPromise = promisify(User.countUsers)();
let coutCarsPromise = promisify(Cars.countCars)();
let countOrdersPromise = promisify(Orders.countOrders)();
try {
let [coutUsers, coutCars, countOrders] = [ // Run the tasks collection of functions in parallel, without waiting until the previous function has completed.
await coutUsersPromise,
await coutCarsPromise,
await countOrdersPromise,
];
let outPut = {
coutUsers: coutUsers,
countCars: coutCars,
countOrders: countOrders,
};
res.status(200);
res.json(outPut);
} catch(err) {
// Error
res.status(400);
res.json(err);
}
});
答案 1 :(得分:0)
我建议您将函数转换为Promise基本函数。
转换后,剩下的就是将如下所示的命令链接起来
function myFunction() {
var cells = document.getElementById("myTable").rows[0].cells
let sum = 0;
for(let i = 0;i<cells.length;i++){
sum += +cells[i].textContent
}
document.getElementById("demo").innerHTML = sum
}
您可以从以下位置找到有关Promise以及如何创建基于Promise的功能的更多信息: Mozilla Link和 Google Link