我在项目中有3个模块:A,B,C;所有这些都使用Rethinkdb,它需要在初始化时进行异步r.connect调用。
我试图从命令行从模块A到B进行呼叫;但是,尽管在require()上启动r.connect,但B无法提供此服务,因为在模块A调用时,rethinkdb尚未加载。
这个代码可以以什么方式重构,这样我才能在调用B之前确保所有初始化都完成?
我试图使用闭包来传递模块周围的状态;但是,由于r.connect仅作为异步函数可用,因此采用以下形式:
r.connect( config.rethinkdb, function(err, connection) {
rconn = connection;
// all module requires
require("./moduleB")(rconn);
require("./moduleC")(rconn);
...lotsacode...
});
哪种感觉非常错误。还有更好的建议吗?
答案 0 :(得分:1)
您可以使用promise,并传递连接。像这样的东西
r.connect(config.rethinkdb)
.then(function(connection) {
//do some stuff here if you want
initWholeApp(connection)
})
和initWholeApp
内部连接,您可以放置应用程序代码。
您甚至可以将其简化为
r.connect(config.rethinkdb)
.then(initWholeApp)
initWholeApp
是一个接受参数作为建立连接的函数。
除此之外,您甚至可以在完成该查询后运行连接上的每个查询(只需确保关闭连接),或者使用带有支持它的驱动程序的RethinkDB连接池,例如{{3或者滚动你自己。