我在一个项目中有3个模块:a,B,C;它们都在使用Rethinkdb,这需要在初始化时调用异步r.c connect。
我正试图从命令行从模块a调用到B;然而,尽管在require()上启动r.connect, B无法提供此服务,因为rethinkdb在模块A调用时尚未加载。
可以用什么方式重构这段代码,以便我可以确保在调用B之前完成所有初始化?
我试图使用闭包来传递模块周围的状态;但是,由于r.c nect只能作为异步函数使用,所以它的形式为:
r.connect( config.rethinkdb, function(err, connection) {
rconn = connection;
// all module requires
require("./moduleB")(rconn);
require("./moduleC")(rconn);
...lotsacode...
});
感觉很不对。有更好的建议吗?
您可以使用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
是一个接受参数作为建立连接的函数。
不仅如此,您甚至可以在完成该查询后在连接上运行每个查询(只需确保关闭连接),或者使用带有支持它的驱动程序(如https://github.com/neumino/rethinkdbdash)的RethinkDB连接池或滚您自己的。