【问题标题】:IndexedDB: avoiding callback-hellIndexedDB:避免回调地狱
【发布时间】:2014-01-23 14:03:57
【问题描述】:

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

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

【问题讨论】:

  • 在主流浏览器实现 ES6 生成器之前,没有办法“只同步编写”。最好的办法是使用control-flow library 来减轻痛苦或在 Javascript 的异步感知超集中编写程序,该超集编译成代码的回调版本,例如 this
  • 基本上这需要我将整个 IndexedDB API 包装到 async.js-wrapper 中?
  • 不,您的代码仍将通过与以前相同的回调与 indexdBAPI 进行交互。不同之处在于,这些工具让您的代码更有条理,而不是使用嵌套回调的"pyramid of doom" 模式。

标签: javascript html indexeddb asynccallback


【解决方案1】:

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

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

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

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

【讨论】:

  • Pubsub 模式过于解耦,会导致 spreattigi 代码。 Promise 或 generator* 模式更适合索引 db api。
  • 嗨 Kyaw 我同意承诺模式是更好的事件链方法,但是在我的情况下,它适用于 pubsub 模式,因为我用于连接不同的逻辑实体并且我没有深度链接。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2016-03-27
    • 2015-08-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多