Node.js设计:多个异步函数使用作为闭包传递的函数写入数据库
Node.js design: multiple async functions writing to database using function passed as a closure
我正在Node中编写一个独立的web scraper,从命令行运行,它在一组页面上查找特定数据,从Google Analytics获取页面视图数据,并将其全部保存在MySQL数据库中。几乎一切都准备好了,但今天我发现在数据库中写入数据的方式有问题。
为了简化操作,我们假设我有一个index.js
文件和两个控制器——db
和web
。Db
向数据库读取/写入数据,web
使用可配置数量的PhantomJs实例来废弃页面。
Web公开一个函数checkTargetUrls(urls, writer)
其中urls
是一个具有要检查的url的数组,writer
是一个可选参数,仅当它是一个函数并且有要写入的数据时才调用。
现在,我通过编写器的方式显然是错误的,但看起来如下(在index.js
中):
some code here
....
let pageId = 0;
... some promises code,
which checks validy of urls,
creates new execution in the database, etc.
...
.then(ulrs => {
return web.checkTargetUrls(urls,
function(singleUrl, pageData) {
...
a chain of promisable functions from db controller,
which first lookup page id in the db, then its
puts in the pageId variable and continues with write to db
...
}).then(() => {
logger.info('All done captain!');
}).catch(err => {logger.error(err})
pageId
随机被上一页/下一页的id覆盖,并保存无效数据。在web
中,有多达10个PhantomJ的并发实例在运行,它们在分析页面后调用writer
函数。对不起,我的语言,但对我来说,这种情况的一个类比是,如果我有,比如说,某个对象的10个实例,然后它们依赖于一个单例进行编写,这会导致pageId
覆盖问题(不知道如何用JS/Node.JS术语正确表达)。
到目前为止,我已经找到了一个解决这个问题的方法,但它很难看,因为它引入了紧密耦合。如果我把writer
代码放在一个单独的模块中,然后直接从web
控制器内部加载,一切都会很好。但对我来说,这是一个糟糕的设计模式,我宁愿不这样做。
var writer = require('./writer');
function checkTargetUrls(urls, executionId) {
return new Promise(
function(resolve, reject) {
let poolSize = config.phantomJs.concurrentInstances;
let running = 0;
....
a bit of code goes here
....
if (slots != undefined && slots != null && slots.data.length > 0) {
return writer.write(executionId, singleUrl, slots);
}
...
more code follows
})
}
我很难找到一个更好的解决方案,在那里我仍然可以传递writer
作为checkTargetUrls(urls, writer)
函数的参数。有人能给我指明正确的方向吗?或者建议在哪里寻找答案?
我并不完全清楚全局pageId的确切问题,但您可以通过从"web"控制器中公开setWriter函数来减少耦合。
var writer;
module.exports.setWriter = function(_writer) { writer = _writer };
然后在你的index.js顶部附近,类似于:
var web = require('./web');
web.setWriter(require('./writer'));
- 构造函数函数闭包变量
- var 函数名称与函数闭包中的名称分配
- 函数闭包
- 何时使用自包含函数(闭包),何时不使用自包含函数
- 避免在 JavaScript 中使用函数闭包
- 难以理解Javascript嵌套函数/闭包
- 在 Javascript 中优化函数闭包的使用有多大价值
- 调用超级构造函数(闭包编译器和库)
- 如何从浏览器控制台访问存储在函数闭包中的 javascript 变量
- 如何在 javascript 中访问父函数闭包
- 函数闭包中的另一个jQuery版本
- jquery对象文字函数/闭包-缺少一些明显的东西
- 这两个使用父类的函数闭包有什么区别吗?
- JavaScript自调用函数闭包不能正常工作
- 改变“;var”;在创建新实例的构造函数闭包内部
- 函数闭包显示外部函数的变量
- 如何使用jsdoc-toolkit记录匿名函数(闭包)
- .prototype不允许在函数闭包中使用
- 自调用匿名函数闭包内变量的生命周期
- 多个文件上的相同函数闭包