也许我正在尝试做一些愚蠢的事情,但我有一个Web应用程序(Angular2 +),我正在尝试以可扩展/模块化的方式构建它.特别是,由于缺乏更好的术语,我有各种各样的模块,我希望能够包括或不包括,具体取决于所需的部署类型.这些模块包括通过扩展基类实现的各种功能.
为了简化事情,想象有一个GenericModuleDefinition类,有两个模块 - ModuleOne.js和ModuleTwo.js.第一个定义ModuleOneDefinitionClass并实例化导出的实例ModuleOneDefinition,然后将其注册到ModuleRegistry.第二个模块做了类似的事情.
(要清楚 - 它会在运行文件时注册ModuleXXXDefinition对象(例如,由于其他一些.js文件导入其中一个导出).如果没有运行,那么显然什么都没有注册 - 这就是问题我正如我在下面描述的那样.ModuleRegistryModuleXXX.js
在ModuleRegistry有一些方法,将遍历所有的模块,并调用它们各自的方法.在此示例中,可能有一个ModuleRegistry.initAllModules()调用的initModule()方法,然后在每个已注册的模块上调用该方法.
在启动时,我的应用程序(例如,在index.js)调用ModuleRegistry.initAllModules().显然,因为index.js导入导出的ModuleRegistry符号,这将导致ModuleRegistry.js代码被拉入,但由于没有显式引用两个Module .js文件中的任何一个的导出,因此这些文件不会被拉入,并且所以ModuleOneDefinition和ModuleTwoDefinition对象不会被实例化并注册ModuleRegistry- 所以调用initAllModules()将是徒劳的.
显然,我可以ModuleDefinition在我的这些对象中添加无意义的引用index.js,这会强制它们被拉入,以便它们在我调用时注册initAllModules().但这需要对index.js文件进行更改,具体取决于我是否要使用ModuleTwo或不使用ModuleTwo进行部署.我希望仅仅存在ModuleTwo.js足以导致文件被拉入并由此ModuleTwoDefinition得到注册的文件ModuleRegistry.
有没有一种标准的方法来处理这种情况?我不得不编辑一些全局文件(index.js它引用的任何一个或其他文件),以便它有关于所有包含的模块的信息,以便它可以去加载它们?或者是否有一种聪明的方法可以让JavaScript执行目录中的所有.js文件,这样只需复制文件即可让它们在启动时加载?
我遇到了很多,并最终决定找出正确的方法。如果我有一个声明方法的抽象父类,然后某些具体的子类在其实现中实现了真正的逻辑(并且显然使用了方法参数),但是某些子类不需要在该方法中执行任何操作(因此请不要使用方法参数)-无需执行任何操作的操作会在我的代码中生成虚假(在我看来)警告。
例如,如果我有一些类似的类:
abstract class Child {
constructor(protected name: string) {
connsole.log(name + " was just born.");
}
abstract tellThemToDoSomething(command: string);
}
class GoodChild extends Child {
constructor(name: string) { super(name); }
tellThemToDoSomething(command: string) {
console.log("I will do " + command);
}
}
class BadChild extends Child {
constructor(name: string) { super(name); }
tellThemToDoSomething(command: string) {
// bad children just ignore what their parents tell them
}
}
Run Code Online (Sandbox Code Playgroud)
然后,对于该BadChild tellThemToDoSomethign()方法中未使用的参数,我在WebStorm中收到了(TSLint?JSLint?WebStorm?)警告。
我知道一些选择,但似乎都没有。
1)忽略它(但这似乎不是最理想的,因为我将对真正的警告视而不见)
2)从BadChild的方法实现中删除参数(但是不幸的是,它删除了有用的信息,因为稍后我可能要实现它,并且那里没有签名会增加它的难度,并且我还从调用者那里得到了错误,他们期望那里有参数-尽管考虑到我应该能够在JavaScript中调用带有无关参数的方法,但还是可以解决该问题)
3)告诉WebStorm(TSLint)停止对未使用的参数发出警告(但这似乎不是最优的,因为在其他实际问题情况下我不会收到警告)
4)对参数做一些毫无意义的事情,以使它不被使用(显然不是很好)
有经验的Java / TypeScript编码人员在这种情况下会做什么?有没有一种简单的方法可以告诉WebStorm / …
我对 JavaScript/Typescript/Node/Express 世界有点陌生,但从我迄今为止的研究来看,似乎没有一种“可接受的”方法来锁定 Node/Express 应用程序中代码的关键部分。我遇到过几个 NPM 软件包(async-lock、await-lock、rwlock),但它们的每周下载量都出奇的低,而且似乎维护得不是特别好(因为它们的最后发布版本很旧,或者官方维护者明确表示)他没有积极维护它)。似乎没有一个有 TypeScript 定义(至少据我所知)。而且,最有问题的是,似乎没有一个在文档方面有太多内容(除了几个显示常见情况用法的示例)。我在这里看到了一些问题,人们编写了自己的(通常是主动轮询)锁(这似乎不是最优的),或者建议使用数据库进行锁定(这似乎是针对轻量级问题的重量级解决方案)。 async-lock似乎是其中最受欢迎的(从下载数量来看),但我对依赖所有者不承担太多责任的东西有点谨慎(而且文档非常薄)。
我的用例看起来非常简单。我正在构建一个 REST 服务器,并且这些对象具有一些相互依赖性。因此,举例来说,如果有人正在更新 FOO,并且 FOO 引用了 BAR,那么我想将我的关键部分锁定在“FOO”和“BAR”上,然后获取旧的 FOO、任何相关的 BAR,验证更新,并将新的 FOO 写回数据库 - 之后我会释放“FOO”和“BAR”锁。
所以我的问题是 - 对于 TypeScript 中的简单关键部分锁定(支持多个同时锁定/密钥),标准做法/API/包是什么?
这是一个单服务器/单数据库应用程序,因此不需要分布式锁 - 只是尝试处理由于异步 IO 上的“线程切换”而同时处理多个请求的事实。