在快速路由中,我想记录用户对数据库的访问,但不包含:
- 等待其完成后再执行用户想要的任务
- 关心日志记录是否成功
我想知道代码是否正确执行此操作。
该线程( Down-side on calling async function without await )本质上发布了相同的问题,但响应是避免使函数异步。然而自从sequelize
的upsert
返回一个 promise ,我不确定我在下面的代码中是否正确执行了该操作。谁能验证一下吗?
我还注意到,如果您不在异步函数的 try-catch block 中等待 promise ,则 promise 内引发的任何错误都将无法处理。因此我确定logAccess
捕获并处理任何错误。这是正确的做事方式吗?
const { Router } = require('express');
const moment = require('moment-timezone');
const Sequelize = require('sequelize');
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
const userTable = sequelize.define('user', {
user_id: {
type: Sequelize.UUID,
primaryKey: true,
},
last_login: {
type: 'TIMESTAMP',
},
});
const logAccess = (user) => userTable.upsert({
user_id: user.user_id,
last_login: moment().tz('Australia/Sydney').format('YYYY-MM-DD HH:mm:ss'),
}).catch(() => console.log('Logging access to db failed'));
const makeCandy = async (user) => {
await timeout(1000);
return 'chocolate';
}
router.get('/get_candy', async (req, res) => {
try {
const user = req.body.user;
// Log access without blocking thread
logAccess(user);
const candy = await makeCandy(user)
res.status(200).send({ candy })
} catch (e) {
console.log(e);
}
})
最佳答案
不等待就不会捕获:
const foo = () => Promise.reject('foo');
const bar = async() => {
try {
foo();
} catch (e) {
console.log('error caught');
}
}
bar();
我至少得到了“未被捕获( promise )”。
我会捕获 promise 风格的错误
logAccess(user).catch(someErrorHandlingFunction);
或者在我不等待的单独函数中:
const logAccessAndCatchErrors = async (user) => {
try {
await logAccess(user);
} catch(e) {
// put something here
}
}
//...
logAccessAndCatchErrors(user); // not `await logAccessAndCatchErrors(user)`
关于javascript - 使用await 调用异步函数而不阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57952234/