我想缓存存储在一些没有太大变化的MySQL表中的数据。讨论的例子是country_codes,language_codes等,但我也有其他特定于应用程序的数据。这本身并不难。我认为,这让我很困难的是,我在Node,Sequelize和Express的世界中有两个似乎相互矛盾的约束:
我想通过“内联”函数访问数据,我将在JavaScript表达式和语句中广泛使用这些函数。例如,我希望能够使用Country.nameFromCode(code)之类的类方法连接字符串。据推测,这意味着这些方法是同步的。回调和承诺似乎是这种看似简单的请求/要求的真正解决方法。
我希望数据延迟加载。我可以在express-generator的典型bin / www脚本中轻松地在启动时加载数据。但在这里,似乎我的延迟加载数据的请求是合理的。据推测,.nameFromCode函数应该只在第一次访问时从数据库加载数据,然后缓存数据。
所以:我第一次收到.nameFromCode调用时,是否应该使用deasync,sync或synchronize这样的模块?我一定要吗?似乎应该有一个更简单的答案。
Sequelize或mysql驱动程序是否有同步的.query或.find方法?如果是这样,大概这是一种更好的方法?
我应该放弃同步吗? :)我知道异步是节点等的咒语,但对于这样的情况来说,这似乎是一个沉重的代价。
除了上面链接的模块之外,以下是一些看似相关的参考:
感谢。
答案 0 :(得分:0)
Sequelize或mysql驱动程序是否有同步的.query或.find方法?
不幸的是,我不知道。节点始终是异步I / O,但处理两者的fs
模块除外。
第一次收到.nameFromCode调用时,我应该使用deasync,sync或synchronize等模块吗?我一定要吗?似乎应该有一个更简单的答案 [...]
我应该放弃同步吗? [...]这样的情况似乎是一个沉重的代价。
您拥有的一个选项是使用async
/await
,即截至2016年1月,ECMAScript规范中的第3阶段提案。
基本上是:
await
await
的任何功能都应标有async
关键字async
函数将隐式返回Promise 您的代码仍然是异步的。但它几乎看起来像同步代码。真棒!
您可以实现以下内容:
async function claimThatYouAreInCountry ( code ) {
var country = await Country.nameFromCode( code );
console.log( "I'm in " + country.name );
}
Babel playground中的另一个例子(检查输出/控制台!)
我的建议是使用Babel's require hook,因此您的应用中的所有内容都会变得透明,并且您不需要构建步骤。