我想缓存存储在一些变化不大的 MySQL 表中的数据。讨论的示例包括国家/地区代码、语言代码等,但我还有其他特定于应用程序的数据。这本身并不难。我认为,让这件事变得困难的是,我有两个约束,这两个约束在 Node、Sequelize 和 Express 的世界中看起来几乎是矛盾的:
我希望可以通过“内联”函数访问数据,我将在 JavaScript 表达式和语句中广泛使用这些函数。例如,我希望能够使用像 Country.nameFromCode(code) 这样的类方法来连接字符串。据推测,这意味着这些方法是同步的。对于这种看似简单的请求/要求,回调和 promise 似乎是一个真正的解决方法。
我想要延迟加载数据。我可以在启动时轻松地在 express-generator 的典型 bin/www 脚本中加载数据。 。但在这里,我的延迟加载数据的请求似乎是合理的。据推测, .nameFromCode 函数应该只在第一次访问数据库时加载数据,然后缓存数据。
那么:我应该使用像 deasync 这样的模块吗? , sync ,或synchronize我第一次接到 .nameFromCode 电话时?我一定要吗?看来应该有一个更简单的答案。
Sequelize 或 mysql 驱动程序是否有同步 .query 或 .find 方法?如果是这样,这可能是更好的方法吗?
我应该放弃同步吗? :) 我知道异步是 Node 等的口头禅,但对于这种情况来说,这似乎是一个沉重的代价。
除了上面链接的模块之外,这里还有一些似乎相关的引用:
- https://github.com/sequelize/sequelize/issues/803
- How to wrap async function calls into a sync function in Node.js or Javascript?
- Executing asynchronous calls in a synchronous manner
- How to organize a node app that uses sequelize?
谢谢。
最佳答案
Does Sequelize or the mysql driver have a synchronous .query or .find method?
不幸的是,据我所知没有。 Node 始终是异步 I/O,fs
除外。模块,处理两者。
should I use a module such as deasync, sync, or synchronize the first time I get the .nameFromCode call? Do I have to? It seems like there should be an easier answer.
[...]
Should I give up on synchronous anything? [...] it seems like a burdensome price to pay for situations like this.
您可以选择使用 async
/await
,截至 2016 年 1 月,ECMAScript 规范中的第 3 阶段提案。
基本上:
- 任何返回 Promise 的函数都可以被
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 ,因此应用程序中的一切都变得透明,并且您不需要构建步骤。
关于node.js - 使用 Sequelize 和 Node 延迟加载静态数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27892899/