欢迎来到地狱(
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 verions>=8.15的node,则可以使用
util.promisify
异步/等待
语法。
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);
}
});