Node.js中Promise的then块内无赋值直接返回变量的含义是什么
关于这段Promise链式写法的实际作用
你之前的猜测不对,这段代码的.then回调里根本没有做global.db的赋值操作,实际执行逻辑可以拆成几步看:
- 开头的
delete global.db是先清理全局对象上可能残留的旧数据库实例,避免重复初始化时旧实例的缓存、连接状态造成污染,这种写法常见于测试环境、代码热重载场景。 - 调用
exports.loadModels(...)时,实际跑的是内部引入的loader.loadModels方法,这个方法本身返回Promise,给global.db挂上初始化完成的数据库实例的操作,是在loader.loadModels内部实现的,和后面的.then回调没有关系。 .then(() => global.db)的作用很纯粹:等前面的模型加载、数据库连接初始化这些异步流程全部跑完(也就是Promise状态变为成功)之后,把已经挂在全局的db实例作为当前Promise链的返回值透传出去,方便调用loadModelsDefault的地方直接拿到可用的db实例,不用自己手动去全局对象上找。
你可以看实际调用的例子就懂了:
// 业务代码里初始化数据库 const dbTool = require('./db'); dbTool.loadModelsDefault() .then(db => { // 这里拿到的db就是.then回调里返回的global.db,直接就能用来做查询 return db.User.findAll(); })
要是没写这个.then回调做值透传,loadModelsDefault返回的Promise resolve出来的会是loader.loadModels原本的返回值,大概率是loader自身的上下文或者其他无关值,调用方就没法直接拿到db实例用。
你可以自己验证:把
.then(() => global.db)这行删掉再跑,会发现global.db依然会被loader正常赋值,只是调用loadModelsDefault的then回调里拿不到db实例而已,这也能证明赋值操作根本不是这个箭头函数做的。
内容的提问来源于stack exchange,提问作者Claudio Andres Torres Burgos
相关产品推荐
相关产品推荐

