4

我有一个 IndexedDB,它在本地缓存具有三个属性 a、b 和 c 的数据。a 和 b 一起形成一个复合键, c 是我所追求的内容。

现在,客户端从服务器获取我想要显示的项目列表。然后客户端应该在 IndexedDB 中查找 (a,b) 并检索匹配的 c,然后使用 sha1 对 c 进行哈希处理(使用 Rusha,这已经可以正常工作了)。

对于那些 sha1(c_client) 与 sha1(c_server) 不匹配的项目,客户端从服务器检索所有 (a,b) 对(使用一个带有 JSON 序列化数组 (a,b) 的 GET 请求)。服务器返回c的更新内容,然后客户端将新的c存储在IndexedDB中,然后将整个对象数组交给显示函数。

如您所见,大部分逻辑绝对需要顺序操作——但 IndexedDB 是高度异步的。

有什么方法可以以同步的方式做我想做的事吗?

4

2 回答 2

1

我的IndexedDB回调方法是使用发布订阅模式进行事件分派。您可以编写自己的处理程序或使用 JQuery 触发器。

我所做的是对所有逻辑IndexedDB事件进行分组,当IndexedDB回调发生时,它会通知发布者发生了什么样的事件,发布者将通知所有等待该事件的函数。

我拥有的示例事件是:数据库创建,索引完成,同步开始,同步完成......我还有同步进度事件,用于通知用户进度(我正在批量同步)。

发布-订阅模型允许我将代码与 UI 代码高度解耦,IndexedDB从而允许我轻松修改事件操作代码或为同一事件添加更多侦听器。如果您需要顺序功能,您可以链接事件,当一个完成触发它完成并且下一个可以继续。

于 2014-01-24T22:53:29.867 回答
0

在规范最终确定之前,IndexedDB API 的同步版本已被放弃,因此您将始终必须以异步方式工作。

API 也让我很恼火,所以我创建了一个名为db.js的简单包装器,它使用 Promises 进行查询。如果您足够幸运,只针对支持生成器的平台,您可以将它们与 db.js 结合起来,使其更加同步

于 2014-01-29T04:36:40.490 回答