Добро пожаловать в ад (callback hell
).Если вы предпочитаете стиль обратного вызова, вы можете использовать асинхронную библиотеку , она имеет функцию 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);
}
});