Вы также можете попытаться использовать асинхронные функции ES7 или синтаксис async / await, что позволит вам писать свой код МНОГО более синхронно, но при этом он будет выполняться асинхронно и параллельно, если вы того пожелаете.Он поддерживается во всех текущих версиях основных браузеров (кроме IE), а также в движке Google V8, который используется Node.js.
Я быстро взломал ваш код, чтобы использовать синтаксис async / await, возможно,быть странной ошибкой, потому что я просто хотел показать вам преимущества использования асинхронных функций.Это должно выглядеть примерно так:
async function setMyBar(req, res, next) {
const owner = req.queryOwner;
try {
let bar = await Bar.findOne({
placeId: req.body.placeId
});
if (bar) {
owner.bar = bar;
} else {
let savedBar = await barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude);
owner.bar = savedBar;
}
res.json(await owner.save());
} catch (e) {
next(e);
}
}
Также обратите внимание, что ключевое слово async в объявлении функции async гарантирует, что ваша функция всегда возвращает обещание!
Некоторые отличные ссылки для чтения нафункциональность, также предоставляя дополнительную информацию об обещаниях:
https://developers.google.com/web/fundamentals/primers/async-functions
https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8