PlacesTransactions

此模块充当 Places 的事务管理器(以下简称 PTM)。我们需要一个事务管理器,因为书签 UI 允许用户使用“撤销”和“重做”功能。为了实现事务,在 UI 和书签 API 之间插入了一层。此层将所有请求的更改存储在一个栈中,并对 API 执行调用。内部所有事务历史都实现为一个数组,将更改从最旧到最新的存储。

事务实现了所有基本 UI 命令:创建项目、编辑其属性等。所有命令都存储在事务历史记录中,并按顺序执行。

构建事务

事务由模块作为构造函数公开(例如 PlacesTransactions.NewFolder)。这些构造函数的输入采用单个参数的形式,一个包含事务属性的普通对象。输入属性可以是必需的或可选的(例如,keyword 对于 EditKeyword 事务是必需的,但对于 NewBookmark 事务是可选的)。

执行事务(事务的 transact 方法)

创建事务后,必须调用其 transact 方法才能执行并生效。这是一个异步方法,不接受任何参数,并在事务执行后返回一个解析的 Promise。

执行创建项目的事务之一(NewBookmarkNewFolderNewSeparator)会解析为新项目的 GUID。其他事务没有解析值。

如果事务执行失败,transact 会拒绝,并且事务历史记录不会受到影响。同样,如果在同一事务对象上多次调用 transact(成功或失败),它都会抛出异常。

批处理

有时将事务“批处理”或“合并”很有用。

例如,“将所有选项卡添加为书签”可以实现为一个 NewFolder 事务,后面跟着许多 NewBookmark 事务——所有这些都将在单个撤销或重做命令中撤消或重做。

在这种情况下,使用 PlacesTransactions.batch,传递一个事务数组,这些事务将按给定顺序执行,然后在事务历史记录中作为一个条目处理。 PlacesTransactions.batch 返回一个 Promise,在批处理执行后解析。如果一个事务依赖于先前事务的结果,则可以在数组中用一个函数替换它,该函数将 previousArguments 作为唯一参数,并返回一个事务。

事务历史结构

事务历史是一个二维事务栈:事务的顺序与提交的顺序相反。它是二维的,因为 PTM 允许将事务一起批处理以进行撤消或重做。

undoPosition 属性设置为顶部条目的索引。如果该索引处没有条目,则没有要撤消的内容。如果存在任何条目,则 undoPosition 之前的条目是重做条目,第一个条目是顶部重做条目。

来源