javascript - 使用await 调用异步函数而不阻塞线程

标签 javascript node.js asynchronous async-await

在快速路由中,我想记录用户对数据库的访问,但不包含:

  • 等待其完成后再执行用户想要的任务
  • 关心日志记录是否成功

我想知道代码是否正确执行此操作。

该线程( Down-side on calling async function without await )本质上发布了相同的问题,但响应是避免使函数异步。然而自从sequelizeupsert返回一个 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/

相关文章:

javascript - 我可以 "cancel"更新面板中发生的长时间运行的进程吗?

javascript - 在中间没有服务器的情况下通过 Firebase 身份验证和存储设置文件上传限制?

JavaScript 添加和删除类不起作用

JavaScript 字符串替换 "' "

javascript - 我怎样才能在 select <option> 中的 json 数据中显示 "names"?

node.js - 全局安装 Meteor 包

mysql - 使用node.js和ejs从mysql下载PDF

node.js - 如何从fs.statSync stub isFile

c# - 保证信号量顺序?

python - 非阻塞客户端中的事务?