Posts.findOne({id: id})
это тоже post.id, то код можно переписать так:Promise.all([
Posts.findOne({id}).exec(),
Comments.find({id}).exec(),
Links.find({id}).exec(),
])
.then(([post, comments, links]) => {
res.json({post, comments, links});
});
const [post, comments, links] = await Promise.all([
Posts.findOne({id}).exec(),
Comments.find({id}).exec(),
Links.find({id}).exec(),
]);
res.json({post, comments, links});
Posts.findOne({id}).exec()
.then(post => {
Users.findOne({id: post.authorId}).exec()
.then(author => {
Users.findOne({id: author.invitedBy})
.then(invitedByUser => {
res.json({post, author, invitedByUser});
});
});
});
const post = await Posts.findOne({id}).exec();
const author = await Users.findOne({id: post.authorId}).exec();
const invitedByUser = await Users.findOne({id: author.invitedBy}).exec();
res.json({post, author, invitedByUser});
Posts.findOne({id}).exec()
.then(post => {
return Users.findOne({id: post.authorId}).exec()
.then(user => ({post, user}))
})
//...
// произвольное количество дополнительных шагов без увеличения вложенности
//...
.then(data => {
return Users.findOne({id: author.invitedBy})
.then(invitedByUser => ({...data, invitedByUser}));
})
.then(data => res.json(data));
Posts.findOne({id}).exec()
.then(post => Users.findOne({id: post.authorId}).exec())
.then(author => Users.findOne({id: author.invitedBy}).exec())
.then(invitedByUser => res.json(invitedByUser));
console.log(1);
console.log(2);
console.log(3);
// просто какая-то ресурсоемкая синхронная функция
function heavyJob() {
let i = 1e6;
let s = '';
while (i--) {
s += Math.random().toString(36);
}
return s.length;
}
function makeRequest() {
return new Promise(resolve => setTimeout(resolve, 1000));
}
function generateFingerprint() {
const foo = heavyJob();
return makeRequest(foo);
}
// ====
function profile(fn) {
let started = Date.now();
fn().then(() => { // Вот тут не обойтись без then
console.log(`Async time: ${Date.now() - started}`);
});
console.log(`Sync time: ${Date.now() - started}`);
started = Date.now();
}
profile(() => generateFingerprint());
Sync time: 497
...
Async time: 1000
function callAsyncMethod(obj, methodName) {
try {
obj[methodName]()
.catch(err => console.error(`replied with ${err}`));
} catch(e) {
console.error(e);
process.exit(1);
}
}
class Cart {
// ...
send(cart) {
fetch(cart)
.then(data => this.eventEmitter.emit('sent', data));
return this; // это нужно вернуть синхронно не дожидаясь ответа
}
render() {
// ...
}
// ...
}
// ...
const cart = new Cart();
cart.eventEmitter.on('sent', alert('cart was sent'));
cart
.send()
.render();
function send() {
const promise = AJAXLibrary.someRequest()
.then(data => JSON.parse(data)) // вот тут тоже .then()
.catch(err => null);
return [promise, AJAXLibrary.currentRequestId];
}
// ...
const [promise, requestId] = send();
console.log(`request <${requestId}> started`);
const data = await promise;
function syncFn() {
console.log(1);
(async () => {
await fetch(...);
console.log('resolved');
})();
console.log(2);
}
function send() {
console.log(1);
return new Promise(resolve => setTimeout(resolve, 1));
}
function main() {
send()
.then(() => {
console.log(3);
});
console.log(2);
}
main();
Я не говорил вообще такого: Вы сами придумали.
try {
const { rows, rowCount } = db.querySync(query) // положим querySync синхронная версия db.query
return res.status(200).send({ rows, rowCount })
} catch (error) {
return res.status(400).send(error)
}
однако, не всё так однозначно, если используют данную конструкцию по сей день.
Т.к. try catch блокирует дальнейшее исполнение кода и ждёт завершения текущей секции.
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function main() {
console.log(1);
try {
console.log(2);
await sleep(10);
} catch(e) {
}
console.log(3);
}
console.log('outer: 1');
main();
console.log('outer: 2');
outer: 1
1
2
outer: 2
3
async function main() {
console.log(1);
return sleep()
.catch(() => {})
.then(() => {
console.log(3);
});
}
.PHONY: all
all: task1 task2
.PHONY: task1
task1:
echo 'executing task#1'
node -e 'setInterval(() => console.log("world"), 1000)' &
.PHONY: task2
task2:
echo 'executing task#2'
node -e 'setInterval(() => console.log("hello"), 1000)' &