Sequelize的findAll方法在HTTP请求中赋值外部变量不生效问题咨询
Sequelize异步查询无法拿到返回结果的原因说明
核心是JavaScript的异步执行机制导致的,和Sequelize框架本身无关:
- Promise回调属于异步微任务,会等待当前上下文所有同步代码执行完成后才会触发运行。你第一种写法中,给
helper变量赋值的逻辑写在then的回调函数里,执行顺序远晚于你后续读取helper的同步代码,所以读取时helper始终是初始的null值。 - 你将整个查询调用赋值给变量时,拿到的是Pending状态的Promise,是因为数据库查询操作还未完成,Promise尚未进入fulfilled或rejected状态。
- 第二种写法可以正常运行,是因为依赖查询结果的响应逻辑直接写在了
then回调内部,会等数据库查询完成、Promise状态变更后才执行,自然可以拿到正确的返回结果。
更易维护的写法
可以用async/await语法糖简化异步逻辑,写法更接近同步代码,可读性更强:
exports.somePostRequest = async (req, res, next) => { try { const helper = await myModel.findAll(); // 此处可直接使用查询到的helper变量 res.status(200).json({message: helper}); } catch (err) { // 捕获异步操作抛出的错误,交给错误处理中间件处理 next(err); } }
注意:所有依赖异步操作返回结果的逻辑,必须放在异步回调内部,或await异步操作完成之后再执行,不能直接将异步结果赋值给外部同步变量后在同步代码中读取,无法保证执行顺序。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

