IndexedDB:避免回调 - 地狱

时间:2014-01-23 14:03:57

标签: javascript html5 indexeddb asynccallback

我有一个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是高度异步的。

以同步方式做任何我想做的事情?

2 个答案:

答案 0 :(得分:1)

我对IndexedDB回调的处理方法是使用publish subscribe pattern进行事件调度。您可以编写自己的处理程序或使用JQuery触发器。

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

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

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

答案 1 :(得分:0)

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

我也对API感到恼火所以我创建了一个名为db.js的简单包装器,它使用Promises进行查询。如果您足够幸运,只针对支持生成器的平台,您可以将它们与db.js组合到make it more synchronous