async getAll(req, res) {
const query = `SELECT * FROM users`
return db
.query(query)
.then(({ rows, rowCount }) => res.status(200).send({ rows, rowCount }))
.catch(error => res.status(400).send({ error }))
// try {
// const { rows, rowCount } = await db.query(query)
// return res.status(200).send({ rows, rowCount })
// } catch (error) {
// return res.status(400).send(error)
// }
}
async getAll(req, res) {
try {
const { rows, rowCount } = await db.query(query)
return res.status(200).send({ rows, rowCount })
} catch (error) {
return res.status(400).send(error)
}
}
var query = Posts.findOne({id: id});
var promise = query.exec();
promise.then(function (post) {
var query1 = Comments.find({id: post.id});
var promise1 = query1.exec();
promise1.then(function(comments) {
var query2 = Links.find({id: post.id});
var promise2 = query2.exec();
promise2.then(function(links) {
res.json({post: post, comments: comment, links: links})
})
})
});
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));
Прочитал на stackoverflow что try catch лучше использовать для синхронных действий, а then catch для асинхронных? Так ли это?Да.
скорее, привычка (и незнание конструкции then-catch)
Т.к. 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);
});
}
однако, не всё так однозначно, если используют данную конструкцию по сей день.
В большинстве же случаев не вижу никаких проблем использовать async/await.А кто вообще начал разговор про async/await и, разве кто-то говорил, что будут какие-то проблемы при их использовании? Я не говорил вообще такого: Вы сами придумали.
Такая конструкция не может быть (насколько мне известно) преобразована в async/await.
Я не говорил вообще такого: Вы сами придумали.
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)
}
function send() {
console.log(1);
return new Promise(resolve => setTimeout(resolve, 1));
}
function main() {
send()
.then(() => {
console.log(3);
});
console.log(2);
}
main();
function async main() {
const p = await send();
console.log(2);
// делаем что-то с p
console.log(3);
}
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);
}
async function asyncCall(fn, started) {
const result = await fn();
console.log(`Async time: ${Date.now() - started}`);
}
async function profile(fn) {
let started = Date.now();
asyncCall(fn, started);
console.log(`Sync time: ${Date.now() - started}`);
started = Date.now();
}
async function callAsyncMethod(obj, methodName) {
try {
const method = obj[methodName];
try {
await method();
}
catch(err) {
console.error(`replied with ${err}`)
}
} catch(err) {
console.error(err);
process.exit(1);
}
}
class Cart {
async fetchCart(cart) {
const data = await fetch(cart);
this.eventEmitter.emit('sent', data);
}
send(cart) {
this.fetchCart(cart);
return this;
}
render() {
}
}
Я просто обращаю внимание на то, что в некоторых очень узких кейсах использовать .then() будет куда проще и понятнее.